這是我的代碼
int wordSize = 8; // defining a word size
int *myArray = NULL;
myArray = malloc(sizeof(char)*(wordSize 1)); // using malloc() so I always have a big enough array should wordSize change. Also to practice.
int index = 0; // defining a variable to browse through myArray
do
{
myArray[index] = '*';
index ;
}
while(index < wordSize);
myArray[wordSize] = '\0'; // filling myArray with '*' character and the null terminator /0
printf("%s", myArray); // trying to display myArray, only a single '*' is printed
printf("\n\n");
int i=0;
while(i < wordSize 1)
{
printf("%c", myArray[i]);
i ;
} // trying to display myArray with an other method, this time with success
自從
char string[] = "hello";
printf("%s", string);
作業得很好,我不明白為什么printf("%s", myArray);不作業,只顯示一個*. do/while 回圈*按預期顯示 8 ,這意味著我的陣列已按預期填充。
編輯:如評論中所問,簡化了我的示例并嘗試了一些解決方案和其他一些可能性。
uj5u.com熱心網友回復:
我認為這就是問題所在。
int *myArray = NULL;
...
printf("%s", myArray);
您試圖列印一個整數陣列,就好像它是一個字串一樣。我認為,通過將錯誤型別的變數傳遞給printf(),您將呼叫未定義的行為。您只為wordSize 1 bytes分配了足夠的記憶體,然后繼續將值寫入陣列,就好像它對wordSize 1 integers 來說足夠大一樣,這也是有問題的。
通過更改 的定義來解決此問題myArray:
char *myArray = NULL;
訪問此陣列成員的其余代碼現在應該從寫入int值更改為寫入char值。需要明確的是,我認為您不需要更改任何內容。編譯器應該為你做這件事,一旦myArray被正確定義為char.
ETA:更多關于原始代碼中發生的事情。
最初,您分配 9 個位元組。這足以容納略多于 2 個整數(假設sizeof(int)為 4)。我還假設這個記憶體最初充滿了零。
分配給的記憶體myArray如下所示:
myArray[0] 00 00 00 00
myArray[1] 00 00 00 00
myArray[2] 00
然后你遍歷并在記憶體中存盤 8 個 '*' 字符,這使得記憶體看起來像這樣:
myArray[0] '*' 00 00 00
myArray[1] '*' 00 00 00
myArray[2] '*'
請注意,另外五個星號被寫入您不擁有的記憶體中。然后寫入“終止零”,再次在為 分配的記憶體之外myArray。
然后,您將myArray- 意思是第一個位元組的地址myArray- 傳遞給printf()。您使用了%s格式說明符,因此它將列印一個字串。在它列印第一個位元組(星號)之后,它看到的下一個位元組是零,所以它停止了。
最后,您訪問單個整數成員,myArray就好像它是一個由八個整陣列成的陣列(即使沒有足夠的記憶體來容納三個)。這意味著,代碼將對應的四個位元組讀myArray[0]入一個臨時整數,并像列印字符一樣列印其值(因為%c傳遞給的格式說明符printf())。隨著回圈的繼續,后面的記憶體區域將被讀取,包括不屬于您的記憶體。觀察到的結果是星號仍然在你寫的地方。
請注意,這完全基于對您的開發環境、目標架構等的假設。您觀察到的確切機制可能很有趣——但重要的是要記住,這都是未定義行為的例子。您不應該依賴它,因為在不同的系統中或在不同的日子,結果可能完全不同。
uj5u.com熱心網友回復:
如果 testCharacter 是用 0 初始化的,我認為你應該為 displaySecretWord 使用字符指標型別
,然后為 displaySecretWord分配 sizeof(char) * (characterCount 1)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/315014.html
