我在理解动态内存分配的概念方面存在问题,我有一些代码遇到了段错误,也许有些人可能会有一些见解?
#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;
}
当我打电话运行这个程序时,我得到一个段错误,有人可以帮助我吗?
答案 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);
我真的不知道你想用它实现什么,你可以添加更多信息吗?