繁体   English   中英

结构C的2d数组的未定义行为

[英]Undefined behavior with 2d array of struct C

我有一个二维结构数组,我将字符串分配给它,这是我的结构。

struct node {
  char* value;
};

这是我的分配(我是C的新手,所以不确定是否正确),但总会有35列,但可能有数百万行(我现在只有3列用于测试)

const int rows=3;
    struct node ** arrayofnodes[rows][35];
for(int i=0; i<rows; i++) {
    array[i] = malloc(test * sizeof array[0]);
    for(int j=0; j<35; j++) array[i][j] = malloc(sizeof array[0][0]);
}

然后,我从一个csv文件中逐个字符地读取了一个临时字符串,并使用下面的代码将temp的值分配给我想要的位置。

//int row and count are defined in my while loop I have for counting commas(or what col I am on) then new lines for the rows 
arrayofnodes[row][count]->value=strdup(temp);
   printf("%s  \n", arrayofnodes[row][count]->value);
   printf("%d %d \n",row, count );

当我按照上面的方式分配时,它似乎起作用了。 我添加了这些打印语句,以确保它分配了正确的值。

例如上面将打印出类似

 Red 0 0 

这是正确的位置。

但是之后,我完成了所有分配工作。 我放置了一条打印语句printf("%s \\n", arrayofnodes[0][0]->value); 测试我是否可以检索如上所示的第一个值,该值为“红色”。

在我的终端中,它输出“ @`??” 或“ @Pz?” 或任何随机输出。 除了0,0以外,我还尝试了很多其他方法,但是它们都得到相同的结果。 我想我只是感到困惑,为什么打印语句在分配它们后立即起作用,而在我稍后调用它们时不在代码末尾起作用。

您可以通过在结构内部使用恒定大小来避免过于复杂的分配:

struct OneRow
{
    char Value[35];
}

const int Rows=3;

OneRow *MyArray=NULL;

MyArray = (OneRow*) malloc (Rows*sizeof(OneRow));

您现在可以访问每个元素(字符)或整个字符串

MyArray[rownumber].Value[colnumber] = …
strcpy (MyArray[rownumber].Value, "I'm_shorter_than_35"); //34 chars max + null-term

这就是您要尝试执行的操作。 您将需要扫描csv文件并计算所需的行数,然后根据需要填充值。

#include <stdio.h>
#include <stdlib.h>

struct node {
  char* value;
};

int main() {
  const int rows = 3; // you will need to compute this beforehand
  const int columns = 35;

  struct node** arrayofnodes = malloc(rows * sizeof(struct node*));

  for (int i = 0; i < rows; ++i) {
    arrayofnodes[i] = malloc(columns * sizeof(struct node));
  }

  for (int i = 0; i < rows; ++i) {
    for (int j = 0; j < columns; ++j) {
      arrayofnodes[i][j].value = malloc(...);
      strcpy(arrayofnodes[i][j].value, ...); // etc..
    }
  }

  for (int i = 0; i < rows; ++i) {
    for (int j = 0; j < columns; ++j) {
      free(arrayofnodes[i][j].value);
    }
  }

  for (int i = 0; i < rows; ++i) {
    free(arrayofnodes[i]);
  }

  free(arrayofnodes);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM