当参数参数是双指针时如何填充结构数组
How to fill an array of structs when parameter argument is a double pointer
正在做作业,在用值填充结构数组时遇到问题,因为我在填充超过第一个元素的任何内容后不断收到“大小 8 的无效写入”错误。
#include <stdio.h>
#include <stdlib.h>
struct DS_t {
int a;
double b;
char c;
};
void f4(struct DS_t ** x) {
*x = (struct DS_t *) malloc(4 * sizeof(struct DS_t));
struct DS_t d1 = {3, 2.3};
*x[0] = d1;
*x[1] = d1;
}
int main() {
struct DS_t * ds4_p;
f4( &ds4_p );
printf("DS_t[0] = {%d, %f, %s}\n", ds4_p[0].a, ds4_p[0].b, ds4_p[0].c);
printf("DS_t[1] = {%d, %f, %s}\n", ds4_p[1].a, ds4_p[1].b, ds4_p[1].c);
printf("DS_t[2] = {%d, %f, %s}\n", ds4_p[2].a, ds4_p[2].b, ds4_p[2].c);
//etc
}
我想使用函数参数中的 *x 到 **x 创建一个 struct DS_t 数组,然后填充该数组,我相信 *x = (struct DS_t *)calloc(4, sizeof(struct DS_t));做。通过可视化工具查看,我看到在 f4 中,x 指向 ds4_p 然后 ds4_p 指向 4 struct DS_t,这就是我想要的。
但是每当我尝试填充它时,我都会收到大小为 8 的无效写入错误。我对 *x[0]= d1 没有问题,它很好地填充了第一个元素,之后的任何内容都是我的问题所在。
我错过了什么?已经研究了一段时间,但没有任何运气。也许我会以错误的方式去做?只需要打印出数组指针的每个元素即可。结构和函数都是这样专门创建的,所以不能改变任何一个。
代码中的一些问题:
[]
的优先顺序高于 *
。所以*x[0] = d1;
其实等价于*(x[0]) = d1;
。这不是你想要的。相反,它应该是 (*x)[0] = d1;
。当然,它后面的那一行也一样。
- 您使用的是
malloc
而不是您声称的 calloc
。这意味着 ds4_p[2]
(和 ds4_p[3]
)未初始化。使用 calloc
或不要尝试访问 ds4_p[2]
.
%s
用于字符串。但是你只有一个char
。请改用 %c
。但请注意,d1.c
设置为 0
,因此 %c
不会打印任何可见字符。
正在做作业,在用值填充结构数组时遇到问题,因为我在填充超过第一个元素的任何内容后不断收到“大小 8 的无效写入”错误。
#include <stdio.h>
#include <stdlib.h>
struct DS_t {
int a;
double b;
char c;
};
void f4(struct DS_t ** x) {
*x = (struct DS_t *) malloc(4 * sizeof(struct DS_t));
struct DS_t d1 = {3, 2.3};
*x[0] = d1;
*x[1] = d1;
}
int main() {
struct DS_t * ds4_p;
f4( &ds4_p );
printf("DS_t[0] = {%d, %f, %s}\n", ds4_p[0].a, ds4_p[0].b, ds4_p[0].c);
printf("DS_t[1] = {%d, %f, %s}\n", ds4_p[1].a, ds4_p[1].b, ds4_p[1].c);
printf("DS_t[2] = {%d, %f, %s}\n", ds4_p[2].a, ds4_p[2].b, ds4_p[2].c);
//etc
}
我想使用函数参数中的 *x 到 **x 创建一个 struct DS_t 数组,然后填充该数组,我相信 *x = (struct DS_t *)calloc(4, sizeof(struct DS_t));做。通过可视化工具查看,我看到在 f4 中,x 指向 ds4_p 然后 ds4_p 指向 4 struct DS_t,这就是我想要的。
但是每当我尝试填充它时,我都会收到大小为 8 的无效写入错误。我对 *x[0]= d1 没有问题,它很好地填充了第一个元素,之后的任何内容都是我的问题所在。
我错过了什么?已经研究了一段时间,但没有任何运气。也许我会以错误的方式去做?只需要打印出数组指针的每个元素即可。结构和函数都是这样专门创建的,所以不能改变任何一个。
代码中的一些问题:
[]
的优先顺序高于*
。所以*x[0] = d1;
其实等价于*(x[0]) = d1;
。这不是你想要的。相反,它应该是(*x)[0] = d1;
。当然,它后面的那一行也一样。- 您使用的是
malloc
而不是您声称的calloc
。这意味着ds4_p[2]
(和ds4_p[3]
)未初始化。使用calloc
或不要尝试访问ds4_p[2]
. %s
用于字符串。但是你只有一个char
。请改用%c
。但请注意,d1.c
设置为0
,因此%c
不会打印任何可见字符。