簡體   English   中英

C程序停止工作

[英]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)也是不夠的。 namechar*的數組,因此是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.

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