我正在尝试在C结构中创建两个动态分配的数组
typedef struct {
int count1;
int count2;
int *array1;
int *array2;
int check;
} __attribute__ ((packed)) test_T;
int main() {
int data[8] = { 2, 3, 20, 21, 30, 31, 32, 100 };
test_T *s_t = malloc(sizeof(s_t));
s_t->array1 = malloc(sizeof(int) * s_t->count1);
s_t->array2 = malloc(sizeof(int) * s_t->count2);
s_t = (test_T *)data;
printf("%dn", s_t->check);
return 0;
}
array1
和array2
的大小都是未知的,分别取决于count1
和count2
。
我的结构数据在main
函数中定义,并将数据放入我的结构中。问题是结构中的check
成员总是32
,但我希望这个值是100
。感谢您的帮助。
您的代码中存在许多问题:
-
__attribute__((packed))
是一个特定于系统的破解。除非你知道自己在做什么,并且认为这是绝对必要的,否则你不应该使用这种不便携的东西。 -
第一个
malloc()
的大小不正确:test_T *s_t = malloc(sizeof(s_t));
应该是test_T *s_t = malloc(sizeof(*s_t));
-
CCD_ 12和CCD_。
malloc()
返回的对象未初始化,因此所有结构成员都未初始化。目前尚不清楚这些成员的初始值应该是多少,8似乎是合理的。 -
s_t->check
未初始化。如果这是预期值,则应将其初始化为100
。 -
s_t = (test_T *)data;
是伪造的:如果需要的话,应该将data
中的值复制到数组中。
这是一个修改后的版本:
#include <stdio.h>
#include <stdlib.h>
typedef struct test_T {
int count1;
int count2;
int *array1;
int *array2;
int check;
} test_T;
int main() {
#define DATA_COUNT 8
int data[DATA_COUNT] = { 2, 3, 20, 21, 30, 31, 32, 100 };
test_T *s_t = malloc(sizeof(*s_t));
s_t->count1 = DATA_COUNT;
s_t->count2 = DATA_COUNT;
s_t->array1 = malloc(sizeof(int) * s_t->count1);
s_t->array2 = malloc(sizeof(int) * s_t->count2);
s_t->check = 100;
for (int i = 0; i < DATA_COUNT; i++) {
s_t->array2[i] = s_t->array1[i] = data[i];
}
printf("%dn", s_t->check);
return 0;
}
您的代码中有多个错误,但在这个答案中,只有一个对其中一个错误做出响应:指针与数组
我想你误解了指针和结构的工作方式。CCD_ 19是一个指针。在AMD64上,指针总是有8个字节。这并不取决于它们指向的位置。在AMD64上,当编译器不添加一些填充时,Test_T
将使用28个字节。当您分配内存并将指针存储在array1
中时,这意味着array1
现在指向您用malloc()
保留的内存区域。array1
和array2
都是数组,它们都是指针。也许你为他们选择了一个不那么误导人的名字?
数组1和数组2的大小都是未知的
这是错误的。它们是指针,它们的大小是已知的。未知的是所指向的内存区域的大小。此内存区域可以用作数组,array1
不是数组。
如果你想在结构中有一个变量数组,你必须把一个数组作为最后一个没有大小信息的元素,当你为结构保留内存时,你必须在结尾和结构中添加数组的空间。一个结构中只能放置一个变量数组。所有其他的都需要添加指针。
像这样:
#include <stdlib.h>
struct Test_T
{
int someOtherData;
size_t count;
int variableArray[];
};
int main(void)
{
size_t count=5;
struct Test_T *s_t=malloc(sizeof(*s_t)+sizeof(int)*count);
//skipped malloc error handling, but you should do that in real programs
s_t->count=count;
// .. some more code should be placed here ...
free(s_t); //do not forget to free your allocated memory
}