动态矩阵的动态结构

时间:2017-12-03 12:41:34

标签: c matrix dynamic struct

我在做一个学校项目时遇到一些麻烦,我不能在这里发布我的所有代码,因为它可能会被我的同学复制。

我创建了一个名为Messages的动态结构,其中包含变量char ** phrasesint lines(目前的短语数量),int heaplines(max number of lines my char ** phrases can hold)

我的程序应该这样工作:它要求用户插入消息,为它们分配内存并增加变量行,这是他当前拥有的消息数,如果达到最大值,那么我会重新分配+10加上行,它会增加堆积线。但我真正的问题是我无法为用户插入的字符串分配内存,因为它给我一个错误说:

Incompatible Pointers types "char **" and "char *"

MSG->phrases=(char*)malloc((tamphrase+1)*sizeof(char));

char ** msg的矩阵分配线条它完美地工作,但是当我尝试为将要插入的字符串分配内存时,它会在上面的代码行中给出错误。

顺便说一句,我怎样才能增加短语矩阵的行? 例如:

MSG->(phrases+i)=(char*)malloc((tamphrase+1)*sizeof(char));

(我知道这是错的,但我希望你们知道我想说的是什么)

1 个答案:

答案 0 :(得分:1)

MSG->phrases=(char*)malloc((tamphrase+1)*sizeof(char));char**,因此为其分配内存

MSG->phrases=malloc((tamphrase+1)*sizeof(char*));

然后为每个tamphrase分配内存来保存字符。

MSG->phrases[i]=malloc((MAXLENOFLINE+1)*sizeof(char));

另外,您应该阅读realloc以了解在代码中已经分配的内存耗尽时重新分配的信息。

不要转换malloc的返回值,这是不必要的,这样可以在发生错误时抑制错误。

如果你理解了指针的逻辑,那么你就不会有写这些行的问题。

你说phraseschar**。现在想想char**持有什么。它包含char*个变量的地址。现在,您将分配一块内存,每个内存都能保存char*个变量,然后将其起始地址返回phrases

现在您以相反的方式思考,char*保存char变量的地址。您将为存储char变量的内存分配一个内存。您将起始地址返回到char*变量。 phrases[i]认为。

没有详细说明,代码的一般结构将是这样的

MSG->phrases=malloc((tamphrase+1)*sizeof(char*));
if( MSG->phrases == NULL ){
    fprintf(stderr,"Error in malloc");
    exit(1);
} 
for(size_t i = 0; i < tamphrase+1; i++ ){
    MSG->phrases[i]=malloc((MAX_LINE_LENGTH+1)*sizeof(char));
    if( MSG->phrases[i] == NULL ){
        fprintf(stderr,"Error in malloc");
        exit(1);
    }     
}
...
...
// do cool stuff
..
..

//free the allocated memory
for(size_t i = 0; i < tamphrase+1; i++ ){
    free(MSG->phrases[i]);
}
free(MSG->phrases);