C程序停止工作

时间:2013-11-16 04:24:41

标签: c

我正在尝试用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

这是正确的,因为两个数组都有相同的东西,但我不明白为什么它会崩溃。我错过了什么?

3 个答案:

答案 0 :(得分:1)

您的程序崩溃是因为printVowlOrElse接受长度为5的char*数组,而您只传递长度为char*的{​​{1}}。

您从0迭代到sizeof(name),它将返回sizeof(char**),并超出您提供的长度为2的数组。

它实际上相当危险,因为根据你的编译器,我认为有可能在main中的静态数组的最后一个元素周围浮动一个有效的内存地址。由于我使用VC ++调试了这个(是的,我欺骗并使用了C ++编译器),调试运行时内存用0xCCCCCCCC标记所有未初始化的堆栈内存,这是一个无效的读取位置,从而导致崩溃。您的记忆值可能不同。

请注意,使用sizeof(name)也是不够的。 namechar*的数组,因此char**sizeof将返回字节数的大小,而不是元素的数量。因此,当编译为32位架构时,指针为4个字节,因此得到4。请改用sizeof(name) / (sizeof(char*))。或者,更一般地,sizeof(name) / sizeof(name[0]),一旦您知道name[0]有效。

答案 1 :(得分:1)

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;
}

答案 2 :(得分:1)

char * name []; (以“变量名称”开头读取它向右然后向左,再向右覆盖然后向左,等等......直到你完成它)

因此它被读作“'name'是指向字符的指针数组。”所以如果你正在做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,指名称[0],它是作为指针的数组的第一个元素。在这种情况下为4个字节。

2)name,实际上是那些许多指针作为其元素的数组。因此,它返回array = 4 * 5 = 20 bytes

的大小

现在,如果您有声明 char(* name)[];

这将被解读为“'name'是指向字符数组的指针。” 因此,sizeof(name)将是4个字节。 sizeof(* name)将给出数组的大小。因为* name是指字符数组。

希望这会有所帮助......