【问题标题】:two dimensional char array in a structure gets overwritten while looping结构中的二维字符数组在循环时被覆盖
【发布时间】:2011-10-05 08:33:47
【问题描述】:

我有一个这样定义的结构:

typedef struct stringd{
    char *y;
    char *x[32];
}stringd;

在主程序中,我声明了一个指向 stringd 的指针,如下所示:

stringd *d = malloc(sizeof(*d));

在主函数中,我解析输入字符串,然后将其存储在二维字符数组中

char *c[32];

每当我遇到'|'输入字符串中的字符我将 c 的项目复制到 stringd 结构中的 *x[32] 。如下图:

if (c[i][0]=='\174')
    for(j=0;j<=i;j++){
        d[k].x[j]=c[j]; 
        c[j]=NULL;
    }
k++;

一旦从输入中获取最后一个字符串(分隔符是空格),我将数组 c 的最终副本复制到 stringd 中的 x,如图所示(token 是指向输入字符串的指针);

if(*token == '\0'||*token=='\n' 
    for(j=0;j<=i;j++){
        d[k].x[j]=c[j];
    }

这里的问题是先前存储在 struct char 数组 x 中的字符串在最后一次操作时被垃圾字符覆盖。我哪里错了?

感谢任何帮助,

【问题讨论】:

  • 你有没有为 stringd 的 y 和 x[] 指向的对象分配内存? c[] 的问题相同。如果不是,您正在破坏内存,可能是其他一些对象所在的位置。

标签: c pointers struct


【解决方案1】:

假设您发布的代码按照确切的顺序运行,这就是我所看到的:

您只分配了一个stringd 对象。但是你在第一次循环之后增加k。因此,在最后的 if 语句中,您访问的 d[k] 已超出您的分配范围。

所以如果我没看错,这是未定义的行为,因为您正在写入未分配的内存。

【讨论】:

  • 猜到了。谢谢。这是否意味着我不能使用指向我的结构的指针,或者有没有办法为每个 d[k] 分别分配内存?
  • 您可以在您的 malloc 中分配它们的数组:stringd *d = malloc(sizeof(*d) * n); 其中n 是您想要的数量。
猜你喜欢
  • 1970-01-01
  • 2021-07-17
  • 2018-03-01
  • 1970-01-01
  • 2020-04-01
  • 2015-03-09
  • 1970-01-01
  • 2013-03-03
  • 1970-01-01
相关资源
最近更新 更多