簡體   English   中英

如何在C中(在Visual Studio中)在全局固定大小的數組中設置值?

[英]How do I set values inside a global, fixed-size array, in C (in Visual Studio)?

我的VS2012 Windows Phone項目的一部分在C中。有一天,我一直在努力嘗試初始化數組以在其中放入內容。

每當我嘗試將其初始化為全局函數(在任何函數之外)時,我都會收到一條消息,告訴我不能使用非const值初始化它。

const char* myArray = (const char*)malloc(256);
// Bad code: this isn't initialized with a const

如果我不使用值對其進行初始化,則會收到一條消息,告訴我為其提供值。 所以我給數組分配了一個NULL值。

const char* myArray = NULL;

然后,我需要在某處設置大小,以便在主函數或第一個函數中設置大小:

int myFirstFunctionInTheCode()
{
    myArray = (char*)malloc(256);    
}

然后我得到類似:';' 類型之前預期

因此,我在論壇上搜索並看到Visual Studio中的C是C89,因此,我需要聲明然后在兩個單獨的行上進行賦值,這在我的代碼中的其他地方是不正確的,因此我對-真實標准。 但是在兩行中執行此操作時,仍然會出現相同的錯誤。

然后,我決定使用可用的VS庫中的其他工具來發現,在C語言中,我不能包含sstream,streambuf等,否則我的整個項目都會失敗,並出現數千個錯誤。 因此,我可以使用boost來獲得真實的流庫,但是由於某些線程的使用,它與Windows Phone不兼容。

如何在C中(在Visual Studio中)在全局固定大小的數組中設置值?

我想要實現的功能類似於C#中的某些功能:

static byte[] gentleCSharpArray = new byte[256];

private void easyShotCSharpFunction()
{
    gentleCSharpArray[0] = 0x57;
    gentleCSharpArray[1] = 0x54;
    gentleCSharpArray[2] = 0x46;
}

我從來沒有花太多時間嘗試為數組賦值,所以我想我的全局char *數組完全不對嗎?

第一部分

const char* myArray = (const char*)malloc(256);

這是行不通的,因為C中的全局變量被划分為兩個空格: 數據段bss段 例如:

#include <stdio.h>
#include <stdlib.h>

int* myArray; // uninitialized, represented by bss segment
const char* myArray2 = "abc"; // initialized, goes into data segment

int main ()
{
    myArray = malloc(3*sizeof(int));
    myArray[0] = 111;
    myArray[1] = 222;
    myArray[2] = 333;

    int i;
    for (i=0; i<3; i++)
        printf("%d, %c\n", myArray[i], myArray2[i]);
    return 0;
}

編譯時, const char* myArray2 = "abc"; 不會翻譯成機器指令。 而是創建一個“ abc”在內存中的圖像,並將其與所有其他初始化的全局變量一起放入數據段。 稍后,程序加載器會拾取整個數據段並將其粘貼在內存中, 甚至在程序開始運行之前

未初始化的變量(如示例中的myArray甚至不會發生太多事情。 相反,它在BSS段中表示為編譯器所說的:“我們將需要為未初始化的變量保留n個字節的內存。” 以后,程序加載器會注意到這一點,並在程序甚至開始運行之前保留這n個字節

因此,在初始化全局變量時嘗試進行malloc分配是沒有意義的,因為在創建全局變量時,程序尚未運行。 malloc的機器指令可能甚至還沒有在內存中!



第二部分

static byte[] gentleCSharpArray = new byte[256];

private void easyShotCSharpFunction()
{
    gentleCSharpArray[0] = 0x57;
    gentleCSharpArray[1] = 0x54;
    gentleCSharpArray[2] = 0x46;
}

好的,讓我們將這一點從C#轉換為C。您是否在C中使用const ,因為常量靜態 (幾乎)是標准英語的同義詞? 因為它們在編程上有很大的不同。

  • C和C#中的關鍵字const表示該變量不能為L值
  • 面向對象的語言(如C#)中的關鍵字static表示函數或變量相對於其類的對象實例不變。 C沒有對象,因此沒有模擬對象。
  • 在純C語言中使用關鍵字static表示變量的調用不變,或者函數的可見位置不變(類似於C#中的private ,您可以在此處閱讀更多內容)。

但是您真的想在那里做什么? 只是為程序保留大量內存,對嗎? C沒有byte數據類型,但是char是一個字節的大小; 您可以改用它。 unsigned關鍵字使程序檢查人員清楚地知道,該字符串將不用於字符串:

// Compiled and ran with gcc -O0 -g -Wall on Ubuntu
#include <stdio.h>
#include <stdlib.h>

int* myArray;
const char* myArray2 = "abc";
unsigned char gentleCArray[256]; // <-- here's the declaration you want

static void easyShotCFunction()
{
    gentleCArray[0] = 0x57;
    gentleCArray[1] = 0x54;
    gentleCArray[2] = 0x46;
}

int main ()
{
    myArray = malloc(3*sizeof(int));
    myArray[0] = 111;
    myArray[1] = 222;
    myArray[2] = 333;

    easyShotCFunction();

    int i;
    for (i=0; i<3; i++)
        printf("%d, %c, 0x%x\n", myArray[i], myArray2[i], gentleCArray[i]);

    return 0;
}

程序啟動時, gentleCArray將已經是指向256個字節內存的指針,很可能全為零。 這是我在第1部分中提到的BSS段的結果。對於無需malloc進行自己的內存管理很有用。

您要么:

const char my_array[] = "abcdef";

要么:

char *my_array;

int main(void)
{
    my_array = malloc(some_size);
    /* initialize elements of my_array */
}

示例1沒有意義,因為您試圖在運行時初始化靜態變量。 示例2沒有意義,因為您試圖修改const對象。 從本質上講,您所做的一切都相反。


我想要實現的功能類似於C#中的某些功能:

static byte[] gentleCSharpArray = new byte[256];

private void easyShotCSharpFunction()
{
    gentleCSharpArray[0] = 0x57;
    gentleCSharpArray[1] = 0x54;
    gentleCSharpArray[2] = 0x46;
}

好吧,那你要;

unsigned char arr[256];

void c_version(void)
{
    arr[0] = 0x57;
    arr[1] = 0x54;
    arr[2] = 0x46;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM