问问题
1122 次
4 回答
2
strncpy(h.name+i-1, tmp, strlen(tmp));
不为空终止目标字符串。printf()
下一次尝试打印它可能会崩溃。
于 2013-06-07T02:17:50.713 回答
1
我怀疑您正在 64 位系统上编译,并且没有:
#include <stdlib.h>
在文件的顶部。当你编译时你应该得到一个警告:
内置函数'malloc'的不兼容隐式声明</p>
正如迈克尔伯尔指出的那样,您也没有正确终止字符串。
-g
您应该能够通过调试器(例如gdb)编译和运行它来找出它崩溃的地方。
于 2013-06-07T02:16:13.347 回答
0
字符串的 '\0' 不是全部。虽然你需要
strlen(tmp)+1
但主要错误是您没有像这样取消引用您的 char** 指针:
strncpy(*(h.name+i-1), tmp, strlen(tmp)+1);
printf("h->name=%s\n", *(h.name+i-1));
下面这将起作用,我已经通过我的 gcc 对其进行了测试:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct header {
char **name;
};
int main(void)
{
int i=0;
char **p;
struct header h;
char tmp[10];
memset(&h, 0, sizeof(h));
for(i=1;i<10;i++){
sprintf(tmp, "name%d", i);
//printf("tmp:%s\n",tmp);
p = realloc(h.name, sizeof(char*)*i);
printf("h->name=%p, p=%p\n", h.name, p);
if(p==NULL) {
printf("realloc failed.\n");
return -1;
}
h.name = p;
h.name[i-1] = (char *)malloc(100);
strncpy(*(h.name+i-1), tmp, strlen(tmp)+1);
printf("h->name=%s\n", *(h.name+i-1));
}
return 0;
}
于 2013-06-07T02:49:24.660 回答
0
问题是你的 strncpy 只是 strlen(tmp) 所以如果 temp 是 name5,strlen(tmp) == 5,它不会复制你的 sprintf 放置的 NULL。您需要执行 strlen(tmp)+1 才能复制 NULL。
http://linux.die.net/man/3/strncpy
此外,奇怪的是 h.name 是一个指向 char 的双指针。如果它应该是一个字符串,它应该只是一个 char *。奇怪的是,您只为指向一个条目的单个指针数组分配空间。
于 2013-06-07T02:21:16.737 回答