我需要分配足够的存储器,以用指针指向双相关char阵列。然后填充结构
struct Dataset
{
int size;
char (*items)[][MAX_STRING_LENGTH];
};
我尝试仅为struct和bidemensional阵列分配内存,如下所示
struct Dataset * dataset = malloc( sizeof (Dataset) + (2 * sizeof(char[2][15])) )
然后填充这样的双度阵列,但是我无法做到
strcpy((*dataset->items)[0][0], "HELLO WORLD");
让我们了解什么是char (*items)[][MAX_STRING_LENGTH];
。
它是指向max_string_length字符数组数组。
因此,item
将需要4或8个字节,具体取决于您的平台。
+
符号之后您在这里分配的任何内容都是浪费:
struct Dataset * dataset = malloc( sizeof (Dataset) **+** (2 * sizeof(char[2][15])) )
将其更改为:
struct Dataset * dataset = malloc( sizeof ( struct Dataset));
现在,您需要指针item
指向正确的位置,
因此分配内存并指向它:
dataset->item = malloc(sizeof(char[2][MAX_STRING_LENGTH]));
现在您有item
指向有效内存。使用它。
//--------------------------------------------------------------------------------------------
不是答案: 我坚信您的结构声明本身是有缺陷的。如果您可以发布要达到的目标,那将有所帮助。
至少有两种方法可以做到这一点。一个是问题中概述的方式,用指向char
的2D数组的指针。另一个使用灵活的数组成员(FAM)。
指向2D数组的指针
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
enum { MAX_STRING_LENGTH = 15 };
struct Dataset
{
int size;
char (*items)[][MAX_STRING_LENGTH];
};
int main(void)
{
int rows = 3;
struct Dataset *dataset = malloc(sizeof(struct Dataset) + (sizeof(char[rows][MAX_STRING_LENGTH])));
dataset->size = rows;
dataset->items = (void *)((char *)dataset + sizeof(struct Dataset));
for (int i = 0; i < rows; i++)
sprintf((*dataset->items)[i], "Row 0x%.*X", 2*(i+2), i);
for (int i = 0; i < rows; i++)
printf("Row %d: [%s]n", i+1, (*dataset->items)[i]);
free(dataset);
return 0;
}
这为结构和2D阵列分配了足够的空间。问题未显示的第一个关键步骤是确保初始化items
成员。它必须指向某个地方,您在结构之后为阵列分配了空间。第二个关键步骤是正确使用指针到2D阵列。请注意,对2D字符阵列的对齐没有并发症。如果它是其他类型的2D数组,您可能必须担心对齐方式,尽管这些结构的大小可能是正确的,因此对齐不是问题(除非您使用具有32位地址的编译器int
和16字节long double
和long double
必须在16字节的边界上对齐 - 我不确定是否存在这样的编译器)。
输出为:
Row 1: [Row 0x0000]
Row 2: [Row 0x000001]
Row 3: [Row 0x00000002]
灵活数组成员
这使用一个带有空的前导维数的数组作为与至少一个其他成员的结构的最后一个成员。这次,无需计算偏移,也不需要使用特殊符号来访问数组的元素:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
enum { MAX_STRING_LENGTH = 15 };
struct Dataset
{
int size;
char items[][MAX_STRING_LENGTH];
};
int main(void)
{
int rows = 3;
struct Dataset *dataset = malloc(sizeof(struct Dataset) + (sizeof(char[rows][MAX_STRING_LENGTH])));
dataset->size = rows;
for (int i = 0; i < rows; i++)
sprintf(dataset->items[i], "Row 0x%.*X", 2*(i+2), i);
for (int i = 0; i < rows; i++)
printf("Row %d: [%s]n", i+1, dataset->items[i]);
free(dataset);
return 0;
}
此代码的输出与其他代码的输出相同。
我发现了我的错误两个错误。
第一个。
我应该在零上初始化第一个数组尺寸,以便以后用malloc
更改他的大小,例如
struct Dataset
{
int size;
char (*items)[0][MAX_STRING_LENGTH];
};
第二个要在位置上更改数组的值,我无法用户(*dataset->items)[x][y]
。我必须删除*
strcpy((dataset->items)[0][0], "HELLO WORLD");