我正在尝试:
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];
答案 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>" :"") :"");