我在做一个学校项目时遇到一些麻烦,我不能在这里发布我的所有代码,因为它可能会被我的同学复制。
我创建了一个名为Messages的动态结构,其中包含变量char ** phrases
,int 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));
(我知道这是错的,但我希望你们知道我想说的是什么)
答案 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
的返回值,这是不必要的,这样可以在发生错误时抑制错误。
如果你理解了指针的逻辑,那么你就不会有写这些行的问题。
你说phrases
是char**
。现在想想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);