【问题标题】:C Change Pointer of Array to Larger ArrayC 将数组指针更改为更大的数组
【发布时间】:2011-10-10 03:42:01
【问题描述】:

我在这样的结构中有一个数组:

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

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

我尝试了以下方法:

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

但是 gcc 抱怨:

error: incompatible types in assignment

关于完成此任务的正确方法有什么想法吗?

【问题讨论】:

  • 你不能从 60 的数组大小开始吗?
  • 不,30 和 60 只是简单的示例。实际上,该程序就像一个哈希表。
  • 有点不清楚您要做什么: const char* arr[30] 是一个 30 char* 的数组,但是您尝试将其更改为指向 n char 的数组。
  • 你有 ->* 符号 - 但这是一个 C++ 运算符,而不是 C 运算符。错字?
  • 啊,那我用错了运算符。我正在尝试拥有一个包含 30 个元素的字符串数组,然后稍后将其更改为更大。

标签: c pointers gcc


【解决方案1】:

假设您确实希望您的数组包含char *s,而不是chars,您应该像这样定义您的结构:

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 的原始值仍然有效。)

【讨论】:

  • 我在使用这个解决方案时遇到了一点麻烦:编译器抱怨:错误:请求成员“myarr”不是结构或联合。注意:我正在尝试使用 typedef struct stringtable{} 而不仅仅是 typedef struct{} 因为我需要使用 -> 语法而不是 .句法。结构与对象?
  • 在 C 中,foo->bar 只是 (*foo).bar 的简写。当您将结构本身作为变量时,您应该使用.,当您只有一个指向该结构的指针时,您应该使用->
【解决方案2】:

不要将其分配为结构内的数组。只需将其作为指针即可:

const char *myarr;

这样就可以了:

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

你仍然可以像数组一样使用它,例如

char c = s->myarr[20];

【讨论】:

  • 感谢 Graham 的回复,请看看我对 lostyzd 的回复
【解决方案3】:

你声明一个指针数组,而不是一个指向数组的指针。

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 代替。

【讨论】:

  • 感谢您的回复,我现在正在尝试此操作,但在尝试向数组添加元素时出现错误,如下所示:s->myarr[arrindex] = str.错误:分配只读位置
  • @user987042 不好意思,我忘了告诉你const char是只读的,所以你应该声明char newtable[60]或者使用char *newtable = malloc(60)
  • 谢谢您,先生,这解决了我的阵列大小问题。不幸的是,此更改破坏了以下行:if(strcmp(s->myarr[arrindex], "") == 0)。该行现在导致分段错误。这是因为 strcmp 需要一个 const 变量,而我不再将其声明为 const 吗?
  • 实际上,我什至无法执行以下操作: printf("%s\n", s->myarr[10]);有什么想法吗?
  • @user987042 您似乎使用“char **”作为您标记的答案,所以请更新您的问题并提供更多详细信息,我不明白您要做什么。跨度>
【解决方案4】:

所以在运行时增加内存区域应该真正涉及动态内存分配。我会建议这样的事情:

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 个元素的数组...

希望对你有帮助,

【讨论】:

    猜你喜欢
    • 2018-12-11
    • 1970-01-01
    • 2016-11-17
    • 1970-01-01
    • 2021-04-09
    • 1970-01-01
    • 1970-01-01
    • 2021-09-04
    • 2017-07-03
    相关资源
    最近更新 更多