struct中的动态字符串

时间:2014-01-31 20:02:01

标签: c segmentation-fault

我在理解动态内存分配的概念方面存在问题,我有一些代码遇到了段错误,也许有些人可能会有一些见解?

 #include <stdio.h>
 #include <stdlib.h>


typedef struct tName
{
   char **stringA;
   int capacity;
} tName;

tName *createTName(int length);
tName *destroyTName(tName *l);

int main(void) {
    tName *ll = createTName(10);
}

tName *createTName(int length) {
    tName *temp;
    int i;
    temp->capacity = length;

    temp->stringA= (char**) malloc(sizeof(char*) * length);
    for(i=0;i<length;i++)
       temp->stringA[i] = (char*) malloc(sizeof(char)*50);

    return temp;
}

当我打电话运行这个程序时,我得到一个段错误,有人可以帮助我吗?

1 个答案:

答案 0 :(得分:4)

你的问题在这里:

temp->capacity = length;

您正在将值赋给变量,该变量还没有内存。您必须为结构分配内存。

使用此:

tName *temp = malloc( sizeof(tName) );

如果只编写tName *temp,编译器将只为指针分配4个字节(或64位系统中的8个)。但它不会分配指针指向的内容。

另一个问题是malloc,它为字符串分配内存 - 它应该是这样的:

temp->stringA = malloc(length+1);

所有的拳头,你不必将它与sizeof(char*)(也将是4或8字节)相乘,而是sizeof(char)。变量类型char总是需要1个字节,因此您根本不需要多次使用它。

但是如果你想使用字符串操作,你不能忘记为字符串分配一个额外的字节。这个字节需要用来指定Ascii-0,它指定字符串的结尾。

如果您忘记了这个字节,程序可能导致奇怪的输出,甚至在sefgaults中。

关于这个循环:

for(i=0;i<length;i++)
       temp->stringA[i] = (char*) malloc(sizeof(char)*50);

我真的不知道你想用它实现什么,你可以添加更多信息吗?