相关疑难解决方法(0)

如何在C中包含动态数组INSIDE结构?

我环顾四周,但一直无法找到解决问题的问题.这是我的代码:

 #include <stdlib.h>

struct my_struct {
    int n;
    char s[]
};

int main()
{
    struct my_struct ms;
    ms.s = malloc(sizeof(char*)*50);
}
Run Code Online (Sandbox Code Playgroud)

这里是错误gcc给我的:错误:无效使用灵活的数组成员

如果我在结构中声明s的声明,我可以编译它

char* s
Run Code Online (Sandbox Code Playgroud)

这可能是一个优秀的实现(指针算法比数组快,是吗?)但我想在ca声明中

char s[]
Run Code Online (Sandbox Code Playgroud)

是相同的

char* s
Run Code Online (Sandbox Code Playgroud)

c arrays struct pointers memory-management

45
推荐指数
2
解决办法
7万
查看次数

在C中,A [i] [j]的含义是否取决于A的声明方式?

假设我有一个二维数组grid声明为double grid[5][5].我的理解是,以下陈述是正确的:

  • grid声明时,为5*5双精度分配一个连续的内存块,不多也不少;
  • 当使用表示法访问数组的元素时grid[i][j],这段代码实际上被解释为*(grid+(i*5+j)).

另一方面,我知道我也可以存储与指针数组相同的矩阵,类似于:

double ** grid;
grid = (double**)malloc(sizeof(double*)*5);
for (i=0; i<5; i++)
   grid[i] = (double*)malloc(sizeof(double)*5);
Run Code Online (Sandbox Code Playgroud)

我实际上有一个代码可以做到这一点.问题是,然后它继续grid使用双下标符号来访问前面的元素.这种情况有所不同吗?在这种情况下,grid[i][j]转换为*(*(grid+i)+j),即双重解除?这是我能看到它正确发生的唯一方式.

(这个问题可能源于我(缺乏)对C中指针和数组类型之间关系的理解...)

编辑:

好吧,让我们看看我是否直截了当:

  • grid[i][j]总是被转换成*(*(grid+i)+j);
  • 在这两种情况下,这个表达式确实以不同的方式计算,因为正如Jim在他的回答中所述,指针算法考虑了指向的类型的大小; 然而,在两种情况下都取得了正确的要素;
  • 当且仅当"grid"是2D数组时,此表达式才进一步优化*( (double*)grid + (i*5+j) ),这是可能的,因为编译器知道任何grid[i]实际上是从位置开始的数组grid+i*5.

但这给我留下了一个不可避免的结论:对于2D数组,如果我设置i=j=0,那么我就有了**grid == *((double*)grid).它是否正确?

c arrays pointers multidimensional-array

13
推荐指数
3
解决办法
1709
查看次数

有人可以在Solaris中解释这个'dirent'结构的定义吗?

最近我看着'dirent'结构(在dirent.h中)并且对它的定义感到有些困惑.

注意:此头文件来自我学校的Solaris计算机.


typedef struct dirent {
    ino_t       d_ino;
    off_t       d_off;
    unsigned short  d_reclen;
    char        d_name[1];
} dirent_t;

特别是d_name字段.这在操作系统中如何工作?如果你需要存储一个空终止字符串,那么单个字符串的数组有什么用?我知道你可以通过它的第一个元素获得数组的地址,但我仍然感到困惑.显然有些事情正在发生,但我不知道是什么.在我家的Fedora Linux系统上,这个字段简单地定义为:

char d_name[256];
Run Code Online (Sandbox Code Playgroud)

现在,由于显而易见的原因,这更有意义.有人可以解释为什么Solaris头文件定义结构吗?

c unix struct solaris

6
推荐指数
3
解决办法
4580
查看次数