我在结构中有一个数组,如下所示:
typedef struct mystruct{
const char *myarr[30];
} mystruct;
我需要在程序中稍后将这个数组增加到60个元素,方法是创建一个新数组,复制内容,然后将myarr更改为指向新数组。
我尝试了以下内容:
const char newtable[n];
s->*myarr = newtable;
但是gcc抱怨道:
error: incompatible types in assignment
有关正确方法的任何想法吗?
答案 0 :(得分:3)
假设您确实希望您的数组包含char *
s,而不是char
s,那么您应该像这样定义您的结构:
typedef struct {
const char **myarr;
/* I assume you actually have more members here */
} mystruct;
并将其初始化为:
mystruct s;
s.myarr = (const char **) malloc(30 * sizeof(const char *));
if (!s.myarr) { /* handle out-of-memory condition somehow */ }
然后您可以稍后使用realloc()
扩展它:
const char **tmp = (const char **) realloc(s.myarr, 60 * sizeof(const char *));
if (tmp) s.myarr = tmp;
else { /* handle out-of-memory condition somehow */ }
(请注意,如果realloc()
返回NULL
,则s.myarr
的原始值仍然有效。)
答案 1 :(得分:1)
不要将它作为数组分配到结构中。把它留作指针:
const char *myarr;
然后这会工作:
const char newtable[n];
s->myarr = newtable;
您仍然可以像数组一样使用它,例如
char c = s->myarr[20];
答案 2 :(得分:0)
声明一个指针数组,而不是一个指向数组的指针。
typedef struct { // no need mystruct here
const char *myarr;
} mystruct;
const char newtable[60];
s->myarr = newtable;
但是const char *myarr
与const char (*myarr)[30]
不同,而您实际上并没有按const char newtable[60];
创建新数组,而是需要malloc
代替。
答案 3 :(得分:0)
因此,运行时增长的内存区域应该真正涉及动态内存分配。我建议这样的事情:
typedef mystruct {
char *data;
} mystruct;
[...]
char *ptr = realloc(s->data, 60); // that will copy your previous data over
if (ptr != NULL) {
s->data = ptr;
}
我认为它不应该比真正复杂得多......特别是你应该避免在.data / .rodata部分中静态声明一个60个元素的数组......
希望它有所帮助,