打印成功后 printf 崩溃

printf crashes after successful printing

语言是 C。我有一个 char* 类型的数组(char *array[] / char** array)作为函数参数,我想将它们全部打印到这样的单独行中:

    while (*array) {

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

现在由于某种原因,对于某个输入,它设法打印所有值,但在打印最后一个 *array 后立即崩溃。所以在最后一个 printf 之后,它不再打印 "after last print"。不幸的是,我在 Windows 7 上使用 netbeans C 支持,没有 gdb。当我尝试将它安装到 netbeans 时出现了一些问题,但那是另一回事了。

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

编辑:

一些更多信息:如果我在同一个函数中尝试打印最后一个 *array,它工作正常,并且程序正常继续。所以这有效:

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

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

如果您没有明确地将字符串数组的最后一个元素初始化为 null,它将是一个未初始化的(即 wild 指针),因此当您取消引用它时在 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;
}

我注释掉了使用这个函数后的代码。这导致代码完全成功 运行。很明显,代码的执行顺序不是线性的,它会逐行执行。但是在最后一个 *array 打印之后,它试图执行函数之后的代码。现在,当我注释掉该代码时,该功能就像一个魅力。

感兴趣的朋友,我注释掉的代码与从*数组中释放内存有关。