【问题标题】:Dynamic Struct with Dynamic Matrix带动态矩阵的动态结构
【发布时间】:2018-05-17 00:55:44
【问题描述】:

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

我创建了一个名为 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));

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

【问题讨论】:

  • 请发布您的代码。这是获得答案的唯一方法

标签: c matrix dynamic struct


【解决方案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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-16
    • 2018-03-07
    • 1970-01-01
    相关资源
    最近更新 更多