语言是C.我有一个char *类型数组(char * array [] / char ** array)作为函数参数,我想将它们全部打印成单独的行,如下所示:
while (*array) {
printf("%s\n", *array);
printf("after last print");
array++;
}
现在出于某种原因,通过某个输入,它会设法打印所有值,但在打印完最后一个*数组后会立即崩溃。所以在最后一次printf之后,它不再打印“after last print”了。不幸的是,我在Windows 7上使用netbeans C支持,没有gdb。当我尝试将它安装到netbeans时出现了一些问题,但这是另一个故事。
首先,可能导致这种情况的原因是什么?其次,我怎么能没有gdb尝试最好地调试这种行为?如果一个人提供了一个帮助我调试问题的答案并以这种方式解决问题,那么我也将仅从中获得积分。一些与导致崩溃的函数参数相关的背景信息:我使用strtok从char * string生成char ** arr,其中一个空格用作分隔符。
编辑:
更多信息:如果我在同一个函数内部尝试printf最后一个*数组,它工作正常,程序继续正常。所以这有效:
printf("%s\n", array[4]);
在我的测试用例中,NULL之前的最后一个索引恰好是4。但是当像在前面看到的那样在循环中完成同样的事情时,它确实设法打印它,但是之后立即崩溃,而不再打印第二行。
答案 0 :(得分:2)
如果你没有明确地将字符串数组的最后一个元素初始化为null,那么它将是一个未初始化的(即 wild 指针),所以当你取消引用时在printf
它会崩溃。
要做的事情:
这段代码对我来说很好,并没有崩溃:
#include <stdio.h>
char *array[] = { "Hello", "World", "My", "Name", "Is", "Govind", "Parmar", NULL } ;
int main()
{
int i;
for(i = 0; *(array+i); i++)
{
printf("%s\n", *(array+i));
}
printf("after last print\n");
return 0;
}
答案 1 :(得分:0)
我注释掉了使用此功能后出现的代码。这导致代码的完全成功运行。显然,代码的执行顺序不是线性的,它会逐行执行。但是在最后一个*数组打印之后,它试图执行函数之后的代码。现在当我注释掉那段代码时,这个功能就像一个魅力。
有兴趣的人,我注释的代码与从*数组中释放内存有关。