【问题标题】:Two Dimensional Array of Structs in C - how to declare and useC中结构的二维数组——如何声明和使用
【发布时间】:2014-11-28 08:50:49
【问题描述】:

我一直在尝试获得一个在 C 中工作的非常简单的想法,但我什至无法理解语法。
该程序将从命令行接收一些输入,并使用它们来决定制作二维结构数组的大小。

然后,在 for 循环类型的情况下,我希望能够根据用户输入更改特定的无符号字符。因此,首先我构建了一个二维结构数组,每个结构都包含一个无符号字符数组以及一个名称,然后我可以写入这些结构。

命令行参数是三个字符串。 First one is number of rows, second one is number of columns, third one is size of unsigned char array within each struct.

#include<stdio.h>
#include<stdbool.h>
#include<math.h>
#include<stdlib.h>
#include<string.h>
    typedef struct {
    unsigned char* Data;
    char* name;
    } myStruct;

    myStruct* myArr[][];

    int main(int argc, char *argv[])
    {
       int y = atoi(argv[0]);
       int x = atoi(argv[1]);
       int z = atoi(argv[2]);
       myStruct* myArr[x][y];

      for (int i = 0; i < x; i++)
     {
         for(int j = 0; j < y; j++)
        {
           myArr[i][j]=(myStruct*) malloc(sizeof(myStruct));
           myArr[i][j].Data=(unsigned char*)  malloc(sizeof(unsigned char)*z);  
           myArr[i][j].name = (char*) malloc(sizeof(char)*64);
        }
     }

     //part II - change some entry of myArr based on input from user
     //assume input has been taken in correctly
     int h = 5;//5th row in myArr
     int k = 7; // 7th column in myArr
     int p = 9; //9th unsigned char in myArr[h][k].Data
     unsigned char u = 241;//value to be written
     char* newName = "bob";
     myArr[h][k].Data[p]=u;
     myArr[h][k].name=newName;

     return 0;
    }

此代码不起作用。事实上,它不会编译。有人可以帮助我吗?我只是试图将指针理解为从 java 转换为 C 的一种方式。这是我可以在 Java 中非常轻松地完成的事情,我也希望能够在 C 中完成。我听说二维数组必须在 main 之外声明,因此它在范围内是全局的,因为堆栈的大小是有限的,而二维数组可能会填充它。有人也可以解释一下吗?以及如何声明一个大小在运行时确定的二维数组?

我也打算使用 C 并且只使用 C。所以请不要向我提供 C++ 语法提示。谢谢。

【问题讨论】:

  • 注意:argv[0] 是程序名称。删除myStruct* myArr[][];
  • 我认为它只是从命令行参数构造的字符串数组中的第一个字符串。我错了吗?程序名称是什么意思?
  • 例如prog.exe 7 8 9 : argv[0] : "prog.exe", argv[1] : "7", ...
  • myStruct* myArr[x][y]; 然后myArr[i][j]-&gt;DatamyStruct myArr[x][y]; 然后myArr[i][j].Data
  • myArr[h][k].name=newName; --> strcpy(myArr[h][k].name,newName);

标签: c arrays memory-management struct malloc


【解决方案1】:
 myArr[h][k].Data[p]=u;
 myArr[h][k].name=newName;

应该是

 myArr[h][k]->Data[p]=u;
 myArr[h][k]->name=newName;

因为它们是指针。您的循环中也会出现同样的错误。

myStruct* myArr[][];

这一行无效且无意义,因为你在main()中重新定义了它。

如果要分配动态数组,可以使用:

myStruct **myArr = malloc(x * y * sizeof(**myArr));

【讨论】:

  • 编译器仍然不喜欢 "myStruct* myArr[][];"您可以在上面代码中的 main 方法之外找到它。什么给了?
  • @mufasa56 因为它无效。您必须指定数组的尺寸。
  • 那么这些大数据结构肯定可以被声明为最终入栈?我的印象是这会出错。
  • 另外,如果我动态分配,每个值是否仍然可以使用 [row][column] 访问?还是该结构现在是一维列表?
  • 是的,你可以。我稍微编辑了最后一行,尽管两者都应该工作。
猜你喜欢
  • 1970-01-01
  • 2023-03-25
  • 2021-04-07
  • 1970-01-01
  • 2018-02-22
相关资源
最近更新 更多