我之前问过类似的问题,当时我不知道我的代码有什么问题。正如我被推荐的那样,我会以更好的格式提供它。
这是我的代码发生的情况的示例。
#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 甚至还没有初始化。
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);
因为分配的地址没有改变,所以没有保留更多的内存,这是一个错误的推论。内存管理软件可能会在相同的起始地址保留更多的内存。