C 通过引用更改结构体数组的值

问题描述 投票:0回答:1

我之前问过类似的问题,当时我不知道我的代码有什么问题。正如我被推荐的那样,我会以更好的格式提供它。

这是我的代码发生的情况的示例。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

typedef struct
{
    int id_prod;
} producto;

void carga_producto(producto **productos)
{
    int n = 1;
    printf("Productos before the calloc: %d\n ", productos);
    *productos = (producto *)calloc(1, sizeof(producto));
    printf("Productos after the calloc: %d\n ", productos);
    while (n < 3)
    {
        printf("Value of n %d\n", n);
        producto *temp = realloc(*productos, (n + 1) * sizeof(producto));
        *productos = temp;
        printf("position of temp: %d\n", temp);
        printf("Productos: %d\n ", productos);
        n++;
    }
}

int main()
{
    producto *productos;
    carga_producto(&productos);
}

正如您可以清楚地看到的, realloc 或 = 都没有改变任何指针。 *productos 和 *temp 都保持不变。

由于它们的值不会改变,我无法添加更多。 calloc 和 realloc 都没有做任何事情。

我尝试使用 realloc 和 malloc 并检查解决此问题的方法,但我找不到更改指针的方法。

//这就是我得到的结果

PS C:\Users\Usuario\Desktop\Esizon\test> ./datos.exe
Productos before the calloc: 719321432
Productos after the calloc: 719321432
Value of n 0
position of temp: 1280342752
Productos: 719321432
 Value of n 1
position of temp: 1280342752
Productos: 719321432

//我期待这样的值变化,

其中 calloc 找到指针的位置,然后当更新 Temp 时,将 ptr temp 的值分配给指针productos。

在第二个周期,我期望它在分配更多内存时改变 temp 的值,但它没有做任何事情。

PS C:\Users\Usuario\Desktop\Esizon\test> ./datos.exe
Productos before the calloc: 719321432
Productos after the calloc: 426416321
Value of n 0
position of temp: 1280342752
Productos: 1280342752
 Value of n 1
position of temp: 512346132
Productos: 512346132

应用您的更改

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

typedef struct
{
    int id_prod;
} producto;

void carga_producto(producto **productos)
{
    int n = 0;
    printf("Productos before the calloc: %d\n ", productos);
    *productos = (producto *)calloc(1, sizeof(producto));
    printf("Productos after the calloc: %d\n ", productos);
    while (n < 2)
    {
        printf("Value of n %d\n", n);
        producto *temp = realloc(*productos, (n + 1) * sizeof(producto));
        *productos = temp;
        printf("position of temp: %d\n", *temp);
        printf("Productos: %d\n ", *productos);
        n++;
    }
}

int main()
{
    producto *productos;
    carga_producto(&productos);
}

结果是

PS C:\Users\Usuario\Desktop\Esizon\test> ./datos.exe
Productos before the calloc: -1270876504
 Productos after the calloc: -1270876504
 Value of n 0
position of temp: 0
Productos: -1072923936
 Value of n 1
position of temp: 0
Productos: -1072923936

productos 仍然没有变化,temp 甚至还没有初始化。

c struct pass-by-reference dynamic-memory-allocation pointer-to-array
1个回答
0
投票

productos
carga_producto
的值是
main
传递给它的地址。

*productos = (producto *)calloc(1, sizeof(producto));
不会为
productos
赋值。它为
productos
指向的事物
*productos
分配一个值。

要查看该值,请打印

*productos
,而不是
productos

使用

%p
打印指针,而不是
%d
,并将指针转换为
void *
,如下所示:

printf("Productos before the calloc: %p\n ", (void *) *productos);

因为分配的地址没有改变,所以没有保留更多的内存,这是一个错误的推论。内存管理软件可能会在相同的起始地址保留更多的内存。

© www.soinside.com 2019 - 2024. All rights reserved.