如何解决在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("%d\n",s_t->check);
return 0;
}
array1
和array2
的大小都是未知的,分别取决于count1
和count2
。
我的结构数据在main
函数中定义,并将数据放入我的结构中。
问题是结构中的check
成员始终是32
,但我希望此值为100
。
任何帮助表示赞赏。
解决方法
您的代码中有很多问题:
-
tester
是系统特定的hack。除非您知道自己在做什么,并且认为它是绝对必要的,否则不要使用此类不可携带的东西。 -
第一个
__attribute__((packed))
的大小不正确:malloc()
应该test_T *s_t = malloc(sizeof(s_t));
-
test_T *s_t = malloc(sizeof(*s_t));
和s_t->count1
在使用前必须被初始化。s_t->count2
返回的对象未初始化,因此所有结构成员都未初始化。目前尚不清楚这些成员的初始值应该是多少,似乎是8。 -
malloc()
未初始化。如果这是期望值,则应将其初始化为s_t->check
。 -
100
是虚假的:如果需要,您应该将s_t = (test_T *)data;
中的值复制到数组中。
这是修改后的版本:
data
,
您的代码中存在多个错误,但是在此答案中,只有一个对其中之一做出了响应:指针与数组
我认为您误解了指针和结构的工作方式。
array1
是一个指针。在AMD64上,指针始终为8个字节。这并不取决于他们指向的位置。在AMD64上,当编译器未添加任何填充时,您的Test_T
将使用28个字节。
当您分配内存并将指针存储在array1
中时,这意味着array1
现在指向您用malloc()
保留的内存区域。
array1
和array2
是数组,它们是指针。也许您会为他们选择一个不太容易引起误解的名称?
array1和array2的大小均未知
这是错误的。它们是指针,它们的大小是已知的。所指向的存储区域的大小是未知的。该内存区域可以用作数组,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
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。