1
4

4 回答 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 回答