C 带引用的传递结构数组-分段错误
如何在函数中执行此操作?容器已经是指针,您不需要传递指针的地址,而是:C 带引用的传递结构数组-分段错误,c,pointers,struct,C,Pointers,Struct,如何在函数中执行此操作?容器已经是指针,您不需要传递指针的地址,而是: container = realloc(container, (n + 10) * sizeof(Struct X)); 容器已经是指针,您不需要传递指针的地址,而是: container = realloc(container, (n + 10) * sizeof(Struct X)); 双指针是个问题。代码应为: #include <stdio.h> #include <stdlib.h>
container = realloc(container, (n + 10) * sizeof(Struct X));
容器已经是指针,您不需要传递指针的地址,而是:
container = realloc(container, (n + 10) * sizeof(Struct X));
双指针是个问题。代码应为:
#include <stdio.h>
#include <stdlib.h>
struct X {
char surname[30];
int deg;
};
struct X *read_record(struct X *a, size_t size)
{
struct X *new = realloc(a, sizeof(struct X) * size);
if (new != NULL)
{
for (size_t i = 0; i < size; i++) {
new[i].deg = 0;
}
}
return new;
}
int main(void)
{
size_t n = 10;
struct X *container = malloc(sizeof(struct X) * n);
container = read_record(container, n * 2);
if (container == NULL)
{
fprintf(stderr, "Can't read record\n");
exit(EXIT_FAILURE);
}
}
双指针是个问题。代码应为:
#include <stdio.h>
#include <stdlib.h>
struct X {
char surname[30];
int deg;
};
struct X *read_record(struct X *a, size_t size)
{
struct X *new = realloc(a, sizeof(struct X) * size);
if (new != NULL)
{
for (size_t i = 0; i < size; i++) {
new[i].deg = 0;
}
}
return new;
}
int main(void)
{
size_t n = 10;
struct X *container = malloc(sizeof(struct X) * n);
container = read_record(container, n * 2);
if (container == NULL)
{
fprintf(stderr, "Can't read record\n");
exit(EXIT_FAILURE);
}
}
第一个函数参数的指针类型为struct X**。因此,取消对参数a的引用将得到struct X*类型的指针。现在您可以应用下标运算符,该运算符生成struct X.类型的左值 这就是函数定义的样子
void read_record(struct X* a,int size){ // Check the change
for (int i=0;i<size;i++){
a[i]->deg = 0;
}
}
int main(){
int n = 10;
struct X *container=(struct X*)malloc(sizeof(struct X)*n);
read_record(container,n); // Check the change
}
可替换为本声明
void read_record(struct X** a,int size){
for (int i=0;i<size;i++){
( *a )[i].deg = 0;
}
}
( *a )[i].deg = 0;
另一方面,将第一个参数声明为具有struct X**类型没有太大意义。例如,该函数看起来更简单
a[0][i].deg = 0;
第一个函数参数的指针类型为struct X**。因此,取消对参数a的引用将得到struct X*类型的指针。现在您可以应用下标运算符,该运算符生成struct X.类型的左值 这就是函数定义的样子
void read_record(struct X* a,int size){ // Check the change
for (int i=0;i<size;i++){
a[i]->deg = 0;
}
}
int main(){
int n = 10;
struct X *container=(struct X*)malloc(sizeof(struct X)*n);
read_record(container,n); // Check the change
}
可替换为本声明
void read_record(struct X** a,int size){
for (int i=0;i<size;i++){
( *a )[i].deg = 0;
}
}
( *a )[i].deg = 0;
另一方面,将第一个参数声明为具有struct X**类型没有太大意义。例如,该函数看起来更简单
a[0][i].deg = 0;
调用read_record时,传递一个指向X结构数组的第一个元素的指针
但在read_记录中,您将其视为指向指向X结构的指针数组的第一个元素的指针,即指向X的指针数组。这里有一个细微但非常重要的区别
如果要模拟指针变量的按引用传递,则需要在read_记录中取消对它的引用,以获取原始指针,并记住,这样就有了一个对象数组,而不是指针:
read_record( container, n );
调用read_record时,传递一个指向X结构数组的第一个元素的指针
但在read_记录中,您将其视为指向指向X结构的指针数组的第一个元素的指针,即指向X的指针数组。这里有一个细微但非常重要的区别
如果要模拟指针变量的按引用传递,则需要在read_记录中取消对它的引用,以获取原始指针,并记住,这样就有了一个对象数组,而不是指针:
read_record( container, n );
作为下一步,我想在大小为20的函数中重新分配10个元素的数组。在函数中。这就是为什么我要发送数组作为引用
指针是按值传递的,因此要保存更改并使其在函数范围外可用,在函数结束后,即在main中,指向指针的指针必须是参数,并且必须传递指针的地址,您的总体评估是正确的
但是,您的实现是不正确的,以下是您应该如何实现:
或者,您也可以返回指针,引用
作为下一步,我想在大小为20的函数中重新分配10个元素的数组。在函数中。这就是为什么我要发送数组作为引用
指针是按值传递的,因此要保存更改并使其在函数范围外可用,在函数结束后,即在main中,指向指针的指针必须是参数,并且必须传递指针的地址,您的总体评估是正确的
但是,您的实现是不正确的,以下是您应该如何实现:
或者,您可以返回指针,参考。@SouravGhosh这不是问题所在。这就是为什么这是一个注释,而不是答案@SouravGhosh,谢谢你的评论:在main函数容器中有一个指向X结构数组的第一个元素的指针。您需要按原样将此指针传递给函数。基本上,参数声明struct X**a的意思是a是指向X结构的指针数组。但这不是您在通话中传递的内容。@SouravGhosh这不是问题所在。这就是为什么这是一个评论,而不是回答@SouravGhosh,谢谢你的评论:在main函数容器中有一个指向X结构数组的第一个元素的指针。您需要按原样将此指针传递给函数。基本上,参数声明struct X**a的意思是a是指向X结构的指针数组。但这不是您在调用中传递的内容。@DavidRanieri实际上我也想在函数中重新分配容器,这就是我将其作为引用传递的原因。@DimitrisDimitriadis重新分配的大小是多少?您正在传递10,而容器已经存储了10个元素。@DavidRanieri下一步,我想在函数中重新分配10个元素的数组,大小为20。在函数中。这就是为什么我要将数组作为引用发送。@Dimitr
isDimitriadis这会使所有答案无效,但你有一个edit@DavidRanieri实际上,我还想在函数中重新分配容器,这就是我将其作为引用传递的原因。@DimitrisDimitriadis重新分配的大小是多少?您正在传递10,而容器已经存储了10个元素。@DavidRanieri下一步,我想在函数中重新分配10个元素的数组,大小为20。在函数中。这就是我希望将数组作为引用发送的原因。@DimitrisDimitriadis这将使所有答案无效,但您有一个editWhy?没有必要使用碎片内存。@DavidRanieri我想我有点误读了这个问题,返回指针是一个可靠的解决方案,我更正了我的答案,并发布了这个使用双指针完成的分配,作为你的好答案的替代。为什么?没有必要使用碎片内存。@DavidRanieri我猜我有点看错了问题,返回指针是一个可靠的解决方案,我更正了我的答案,并发布了这个使用双指针完成的分配,作为你的好答案的替代。