我正在尝试创建一个存储字符串的结构,当我尝试将其作为字符串插入数组时,我遇到了一个错误不兼容的类型。这是我第一次使用C中的程序。有人可以帮助发现我的问题。
这是我对list.c的实现
struct list *init_list(int num) {
struct list *p;
p = malloc(LISTSZ(num));
if(p == NULL)
return(NULL);
p->maxsz = num;
p->sz = 0;
return(p);
}
void debug_list(struct list *p) {
int i;
fprintf(stderr, "\nDynamic List\n\n");
fprintf(stderr, " sz = %d\n", p->sz);
fprintf(stderr, " maxsz = %d\n", p->maxsz);
for(i = 0; i < p->maxsz; i++)
fprintf(stderr," %s\n", (p->item[i]));
}
void prt_list(struct list *p) {
int i;
for(i = 0; i < p->sz; i++)
printf("%s\n", (p->item[i]));
}
int ins_list(char *data, struct list **p) {
struct list *q;
if((*p)->sz == (*p)->maxsz) {
q = realloc(*p, LISTSZ((*p)->maxsz + INCRSZ)); // Problem?
if(q == NULL)
return(-1);
q->maxsz += INCRSZ;
*p = q;
}
(*p)->item[(*p)->sz] = data; // incompatible types in assignment
(*p)->sz ++;
return(0);
}
这是我对list.h的实现
struct list {
int sz;
int maxsz;
char item[][1024]; // Problem?
};
#define INITSZ 5
#define INCRSZ 5
#define LISTSZ(n) ((size_t)(sizeof(struct list) + ((n)-1)*sizeof(char[1024]))) // Problem?
struct list *init_list(int num);
int ins_list(char *data, struct list **p);
void prt_list(struct list *p);
void debug_list(struct list *p);
答案 0 :(得分:4)
您有一个char
数组,但是您尝试将char *
放入其中。
我猜我会strncpy
做你想做的事。或者,将item
声明为char *
的数组。
答案 1 :(得分:3)
struct list {
int sz;
int maxsz;
char *item[1024];
};
答案 2 :(得分:2)
C和C ++之间的差异比它通常承认的要多。
对于你的错误,原因很简单,你试图在sz分配一个指针(char *)是一个int。 这种赋值会生成不兼容的类型警告。
你不能做的第二件事(至少据我所知)是一个部分动态的数组。在你的情况下,你应该至少使用malloc,项目的类型应该是char **。但是,有一个技巧只能使用一个malloc来创建2D数组。
对于realloc没什么打击我...编译错误是什么?
但是您的代码看起来不像C代码:/
您可能需要从头开始重建它,因为您在这里混淆列表和2D数组...
如果你愿意,我可以写一些代码示例,但你应该在google上找到一个C基础教程。
好的卢克:)
答案 3 :(得分:0)
在这一行:
(*p)->item[(*p)->sz] = data; // incompatible types in assignment
(*p)->item[(*p)->sz]
是一个1024字符的数组 - 你不能分配给=
的数组(数组是“不可修改的左值”)。
你只需要复制一份。对于长度安全的字符串副本,我更喜欢使用strncat()
:
(*p)->item[(*p)->sz][0] = '\0'; /* Truncate existing string to empty */
strncat((*p)->item[(*p)->sz], data, (sizeof (*p)->item[(*p)->sz]) - 1);