在C结构中动态分配数组响应不正确



我正在尝试在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;
}

array1array2的大小都是未知的,分别取决于count1count2

我的结构数据在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()保留的内存区域。array1array2都是数组,它们都是指针。也许你为他们选择了一个不那么误导人的名字?

数组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
}

相关内容

  • 没有找到相关文章

最新更新