c - 为具有双指针的结构内的动态结构数组分配内存**
问题描述
当我使用这段代码时,我想转向结构数组的每个元素,如下所示:
array[0]->X;
array[1]->X;
我尽我所能,但在所有情况下我都遇到了分段错误。我究竟做错了什么?
请查看#if 0 #endif 之间的块
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <inttypes.h>
typedef struct
{
double X;
double Y;
} ArrayOfStructures;
typedef struct
{
uint_fast64_t length;
ArrayOfStructures **array;
} Points;
typedef struct
{
Points *points;
} Config;
void add_new_array(Config *conf)
{
printf("conf=%p\n",conf);
printf("conf->points=%p\n",conf->points);
printf("conf->points->length=%zu\n",conf->points->length);
printf("conf->points->array=%p\n",conf->points->array);
#if 0
ArrayOfStructures *temp = (ArrayOfStructures*)calloc(conf->points->length,sizeof(ArrayOfStructures));
printf("temp=%p\n",temp);
// Segmentation fault
*conf->points->array = temp;
#else
conf->points->array = (ArrayOfStructures **)calloc(conf->points->length,sizeof(ArrayOfStructures *));
#endif
printf("conf->points->array=%p\n",conf->points->array);
}
void another_function(Config *conf)
{
conf->points->length = 1;
add_new_array(conf);
conf->points->array[0]->X = 0.1;
conf->points->array[0]->Y = 0.2;
printf("The result: X=%.12f, Y=%.12f, length=%zu\n",conf->points->array[0]->X,conf->points->array[0]->Y,conf->points->length);
}
void some_function(Config * conf)
{
// To pass the structure to another function
another_function(conf);
}
int main(void)
{
// Stack's allocated memory
Config conf_;
Config *conf = &conf_;
memset(conf,0x0,sizeof(Config));
// Stack's allocated memory
Points points;
memset(&points,0x0,sizeof(Points));
conf->points = &points;
some_function(conf);
return(EXIT_SUCCESS);
}
编译使用:
gcc -D_SVID_SOURCE -g -ggdb -ggdb1 -ggdb2 -ggdb3 -O0 -DDEBUG -std=c11 -Wall --pedantic arryay.c -o array
我试图找到处理双指针的答案,但一切都非常混乱。
解决方案
您似乎没有初始化length
为有意义的值。因此,您实际上并没有分配内存,因为您调用calloc()
的第一个参数为零。
(免责声明:我没有测试过代码,但这似乎是错误的。)
推荐阅读
- amazon-web-services - 如何在我账户的 DMS 中使用不同 AWS 账户的 S3 存储桶?
- python - 检查对象的属性和变量是否相等
- python-3.x - 导入手电筒和手电筒视觉时出现错误
- python - 需要帮助查看给出输出错误的基本 python 脚本
- express - 更新 Firestore 记录客户端是否安全?
- javascript - 如何处理 mongodb 错误:querySrv ENODATA?
- c# - 我如何检查来自文本框的输入是否==“{”或“}”?
- reflection - F#:如何使用反射获取空的可区分联合案例的实例类型?
- windows - 是什么导致 WriteFile 返回错误 38 (ERROR_HANDLE_EOF)?
- firefox - firefox 开始在几乎每一个动作上都犹豫几秒钟