2012-07-04 23 views
0

我想要做的事:印刷炭[]核心转储Ç

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

其中结构构件(从外部库)是:

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];

+1

你如何用数据填充'providerName'? – RedX

+0

你做了什么来使它非空终止? – nhahtdh

+1

最好的解决方案是首先null终止'providerName'。 – Casper

回答

2

使用每当则可以使用与%s的printf时的最大宽度指示器:

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

如果仍然出现段错误,并且Props不是NULL,那么您的头文件和库二进制文件之间可能会发生冲突。假设你有一个定义标题的新版本:

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

但库二进制文件已经过时,使用下面的定义:

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

如果您现在尝试访问baz你会得到一个分割错误,即使其他成员工作正常。

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

+1

如果实际数据只有10个字符,该怎么办?虽然它不会发生错误(在这里,但在其他一些字符串函数中,可能需要它被终止,所以我认为这只是隐藏了一个错误),但会打印245个垃圾字符。 – hmjd

+0

我试过了,得到一个不同的错误:'程序以信号11结束,分段错误。 [新进程74518] #0 0xfee2193c从/ lib/libc.so.1到memchr() – Awalias

+0

@Ant然后'Props'可能是'NULL'或陈旧。尝试用调试器运行你的程序。 –

0

Props->providerName[255] = 0;之前,使用它可以确保您的数据是NULL终止

0

使用的strcpy(Props->的providerName, “IBM”),如果你想输入 “IBM” 作为提供者的名称。 或者使用gets(str)在str中输入并使用。使用gdb 另外最好方式编译你的程序,并利用对道具检查哪个道具指向

0

的valuse打印值。这似乎并没有被物质包含在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>" :"") :""); 
+0

如果使用printf进行调试,为什么不只是'printf(“Props是0x%p \ n“,道具);'? – mah

+0

当然...... - 也可以做'gdb '然后发出'p Props'。 ;-)当然, – alk

+0

,但你没有建议在你的文章中使用gdb,你建议添加一个printf。 – mah

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()不必做,反正;所以它运行得很快,如果这很重要的话。