[英]C program stops working
我正在嘗試用C編寫程序。我在Java方面很流利,但是我對C的了解並不多,我正在嘗試學習語法。 這個程序的目標並不是真的,我只是在學習比較字符串,打印出東西,學習如何使用數組等等。 該程序未返回任何錯誤或警告,並且運行良好,但是完成后,命令提示符顯示該程序已停止工作。 這是代碼:
#include<stdio.h>
#include<string.h>
void printVowlOrElse(char *name[5]){
int i;
for (i = 0; i < sizeof(name) ; i++){
char *tester[2] = {"a", "b"};
if (strcmp(name[i],tester[i]) == 0){
printf("letter is %s at \n", name[i]);
}
}
}
main()
{
printf("Hello World!! \n");
char* myName[2] = {"a", "b"};
printVowlOrElse(myName);
}
輸出為:
Hello World!!
letter is a at
letter is b at
這是正確的,因為兩個數組具有相同的功能,但是我不明白為什么它會崩潰。 我想念什么?
您的程序崩潰是因為printVowlOrElse
接受長度為5的char*
數組,而您只傳遞了長度為2的char*
。
您從0迭代到sizeof(name)
,這將返回sizeof(char**)
,並且超出您提供的長度為2的數組的邊界。
實際上這是相當危險的,因為根據您的編譯器,我認為可能有一個有效的內存地址在main
的靜態數組的最后一個元素之后浮動。 由於我使用VC ++進行了調試(是的,我作弊並使用了C ++編譯器),因此調試運行時內存將所有未初始化的堆棧內存標記為0xCCCCCCCC
,這是無效的讀取位置,從而導致崩潰。 您的內存值可能會有所不同。
請注意,使用sizeof(name)
也是不夠的。 name
是char*
的數組,因此是char**
, sizeof
將返回字節數而不是元素數的大小。 因此,由於針對32位架構進行編譯時指針為4字節,因此您將獲得4。 請改用sizeof(name) / (sizeof(char*))
。 或者,更一般地說,一旦知道name[0]
是有效的,就可以選擇sizeof(name) / sizeof(name[0])
。
sizeof(name)不返回數組的長度,它返回指針的大小(32位4字節)。 您應該為函數printVowlOrElse提供數組的長度。
您可以將printVowlOrElse編寫為:
void printVowlOrElse(char *name[], int size)
{
int i;
for (i = 0; i < size; i++) {
char *tester[2] = { "a", "b" };
char result = compare_string(name[i], tester[i]);
if (result == 0) {
printf("letter is %s at \n", name[i]);
}
}
}
int main()
{
printf("Hello World!! \n");
char* myName[2] = { "a", "b" };
printVowlOrElse(myName, 2);
return 0;
}
字符* name []; (要閱讀以“變量名稱”開頭的內容,請先向右然后向左,再向右覆蓋然后再向左,依此類推,直到完成為止)
因此,它被讀為“'name'是指向chars的指針的數組”。 因此,如果您正在執行sizeof(name),它將返回數組的大小,因此可以通過sizeof(name)/ sizeof(name [0]);計算數組長度。
#include<stdio.h>
int main()
{
char *name[5];
printf("%d\n", sizeof(*name));
printf("%d\n", sizeof(name));
return 0;
}
output as:
4
20
說明:
1)* name,是指name [0],它是數組的第一個元素,是一個指針。 在這種情況下為4個字節。
2)名稱,實際上是由許多指針組成的數組。 因此,它返回數組的大小= 4 * 5 = 20字節
現在,如果您聲明為char(* name)[];
它將被讀為“'name'是指向字符數組的指針”。 因此,sizeof(name)將是4個字節。 sizeof(* name)將給出數組的大小。 因為* name是指字符數組。
希望這可以幫助...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.