打印char [] core dump C.

时间:2012-07-04 10:52:22

标签: c char printf coredump

我正在尝试:

printf("Provider: %s\n", Props->providerName);

其中struct member(来自外部库)是:

char providerName[256];

导致核心转储的gdb输出为:

Program terminated with signal 11, Segmentation fault.
[New process 73950    ]
#0  0xfee22290 in strlen () from /lib/libc.so.1

我猜char []可能不会以null结尾,但最佳解决方案是什么?

干杯!


编辑:我使用的结构来自外部库,看起来不是空的(我可以成功打印其成员char alias[256];

5 个答案:

答案 0 :(得分:2)

使用%s与printf:

时,请尽可能使用最大宽度指示器
printf("Provider: %.255s\n", Props->providerName);

如果你仍然遇到段错误,而道具不是NULL,你的标题和库二进制文件之间可能会发生冲突。假设您有新版本的标头定义:

struct Thing {
    int foo[256];
    int bar[256];
    int baz[256];
};

但是库二进制文件已过时,使用以下定义:

struct Thing {
    int foo[256];
    int bar[256];
};

如果您现在尝试访问baz,即使其他成员工作正常,您也会遇到细分错误。

(编辑:从“如果你得到段错误”添加文字到答案结束)

答案 1 :(得分:1)

更新:printf()改进为putchar()

其他一些好的答案已经给出了。但是,如果一个人不希望改变providerName,则调用break的循环:

int i;
printf("Provider: ");
for (i = 0; i < N; ++i) {
    const char c = Props->providerName[i];
    if (!c) break;
    putchar(c);
}
putchar('\n');

当然,必须提前设置const int N = 256#define N 256等。如果需要,可以将循环封装在函数调用或宏中。

顺便说一下,无论如何,上面的循环不会做printf()不必做的事情;如果这很重要,它会快速运行。

答案 2 :(得分:0)

Props->providerName[255] = 0;在使用之前将确保您的数据以NULL结尾。

答案 3 :(得分:0)

如果要输入“IBM”作为提供者名称,请使用strcpy(Props-&gt; providerName,“IBM”)。 或者使用gets(str)来获取str中的输入然后使用。 也是使用gdb编译程序并使用p Props打印值以检查Props指向的值的最佳方法

答案 4 :(得分:0)

这似乎不是providerName中包含的数据类型的问题。

很可能Props确实引用了无效的内存位置,例如NULL

您可以使用类似的调试修改来测试它:

char * p = Props->providerName;
printf("Provider: %s\n", p);

我打赌它在尝试执行第一行时会崩溃。

实现这种更灵活的另一种方法可能是:

printf("Provider: %*s%s\n", 
  sizeof (Props->providerName), 
  Props ?Props->providerName :"<no properties available>", 
  Props ?(Props->providerName[sizeof(Props->Props->providerName) - 1] ?" <cut off>" :"") :"");