2016-06-25 63 views
0

语言是C.我有一个char *类型(char * array []/char **数组)作为函数参数的数组,我想将它们全部打印成如下所示的单独行:printf在打印成功后崩溃

while (*array) { 

     printf("%s\n", *array); 
     printf("after last print"); 
     array++; 
    } 

现在出于某种原因,使用某个输入,它管理打印所有的值,但在打印最后一个*数组后立即崩溃。因此在最后一次printf之后,它不再打印“最后一次打印后”。不幸的是,我在Windows 7上使用netbeans C支持,没有gdb。当我尝试将其安装到netbeans时出现了一些问题,但这是另一回事。

首先,有什么可能导致这种情况?其次,我怎么能没有gdb尝试调试这种行为最好?如果一个人提供了一个答案,帮助我调试问题并以这种方式解决问题,那么我也会单独给予答案。与导致崩溃的函数参数相关的一些背景信息:我使用strtok从char *字符串中生成char ** arr,其中空格用作分隔符。

编辑:

一些更多的信息:如果我同样的函数内尽量给printf的最后一个*阵列,它工作正常,程序继续正常进行。所以这个工作原理:

printf("%s\n", array[4]); 

在我的测试用例中NULL前面的最后一个索引恰好是4。但是当同样的事情在前面看到的循环内部完成时,它确实能够打印它,但是之后立即崩溃,而不是再打印第二行。

+0

很可能最后一个数组元素没有用NULL指针设置。你需要像'array [n] = NULL;',其中'n'是字符串的数量。当然,“阵列”需要一个空间来容纳“n + 1”元素。 –

回答

2

如果你没有明确初始化字符串数组的最后一个元素为空,这将是一个未初始化(即野生指针),所以当你取消对它的引用在printf它会崩溃。

可以做的事:

  1. 明确初始化字符串数组的最后一个元素为NULL,这样的循环就知道该停在年底。
  2. 不是增加指针,而是使用循环计数器变量递增其解除引用它的偏移量。

此代码工作对我蛮好,并不会崩溃:

#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; 
} 
+0

我测试过了,最后一个是NULL,并且它在设法打印最后一个*数组后仍然崩溃,但是不会打印最后一个打印后的'anymore = /。 –

+0

@ VilleMiekk-oja查看我编辑的答案 –

+0

使用你的代码我可以让程序进入一个状态,在这个状态下它会在上次打印之后打印出来,然后崩溃。之后它会崩溃到无记忆功能。我不明白为什么它没有在我的代码版本中打印它,即使它显然崩溃到函数后面的代码。但是你的代码以某种方式做到了,所以我会给你正确的答案。 –

0

我注释掉使用这一功能后所涉及的代码。这导致代码运行完全成功。显然,代码的执行顺序并不是线性的,它将以一行一行的方式执行。但在最后一次*数组打印后,它试图执行函数后面的代码。现在,当我注释掉代码时,该函数就像一个魅力。

那些有兴趣的人,我注释到的代码涉及从*数组中释放内存。