[英]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
,因為常量和靜態 (幾乎)是標准英語的同義詞? 因為它們在編程上有很大的不同。
const
表示該變量不能為L值 。 static
表示函數或變量相對於其類的對象實例不變。 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.