Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 带引用的传递结构数组-分段错误_C_Pointers_Struct - Fatal编程技术网

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我猜我有点看错了问题,返回指针是一个可靠的解决方案,我更正了我的答案,并发布了这个使用双指针完成的分配,作为你的好答案的替代。