C将数组指针更改为更大的数组

时间:2011-10-10 03:42:01

标签: c pointers gcc

我在结构中有一个数组,如下所示:

    typedef struct mystruct{
        const char *myarr[30];
    } mystruct;

我需要在程序中稍后将这个数组增加到60个元素,方法是创建一个新数组,复制内容,然后将myarr更改为指向新数组。

我尝试了以下内容:

const char newtable[n];
s->*myarr = newtable;

但是gcc抱怨道:

error: incompatible types in assignment

有关正确方法的任何想法吗?

4 个答案:

答案 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 *myarrconst 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个元素的数组......

希望它有所帮助,