我正在尝试用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
这是正确的,因为两个数组都有相同的东西,但我不明白为什么它会崩溃。我错过了什么?
答案 0 :(得分:1)
您的程序崩溃是因为printVowlOrElse
接受长度为5的char*
数组,而您只传递长度为char*
的{{1}}。
您从0迭代到sizeof(name)
,它将返回sizeof(char**)
,并超出您提供的长度为2的数组。
它实际上相当危险,因为根据你的编译器,我认为有可能在main
中的静态数组的最后一个元素周围浮动一个有效的内存地址。由于我使用VC ++调试了这个(是的,我欺骗并使用了C ++编译器),调试运行时内存用0xCCCCCCCC
标记所有未初始化的堆栈内存,这是一个无效的读取位置,从而导致崩溃。您的记忆值可能不同。
请注意,使用sizeof(name)
也是不够的。 name
是char*
的数组,因此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是指字符数组。
希望这会有所帮助......