如何使用 realloc 给出大小?
How to give a size using realloc?
我的代码运行不清晰。我想给指针一个随机大小,我想向指针添加一些元素。我想给指针留足够大的地方。例如,如果我在指针中有 10 个元素,我想将 40 个字节的位置分配给指针。但是当我查看我的代码时,最初我为元素提供了如此大的尺寸。我想看到输出:
67
11
64
7
67
11
64
7
23
81
88
35
12
5
7
内存大小=40
#include <stdio.h>
#include <stdlib.h>
int main() {
int *k;
int i=0,j=0,t=0;
int array[20]={67,11,64,7};
k=malloc(5*sizeof(int));
k=array;
for(i=0;i<4;i++){
printf("%d\n",k[i]);
}
k=realloc(k,50*sizeof(int));
k[4]=23;
k[5]=81;
k[6]=88;
k[7]=35;
k[8]=12;
k[9]=5;
k[10]=7;
for(j=0;k[j]!='[=11=]';j++){
printf("%d\n",k[j]);
}
k=realloc(k,(j+1)*sizeof(int));
for(t=0;k[t]!='[=11=]';t++){
printf("%d\n",k[t]);
}
printf("the size of the memory=%d \n",j*4);
printf("the size of the memory=%d \n",t*4);
return 0;
}
您无法调整像 array
这样的自动变量的大小,这是您尝试做的事情,因为您这样做 k=array;
(并泄漏之前分配的内存)。
您可以将数据从 array
复制到 k
指出的已分配内存中:
int array[20] = {67, 11, 64, 7};
int *k = malloc(sizeof array);
memcpy(k, array, sizeof array);
虽然您使用的循环条件有点令人困惑:
for (j = 0; k[j] != '[=11=]'; j++)
我建议与 0
进行比较。
您最后打印的“内存大小”并不准确。最后分配的内存大小为(j+1)*sizeof(int)
,即12 * sizeof(int)
,因为k[11]
是第一个元素0
。
还有一个警告:您的程序当前已定义行为,因为数组在位置 [11, 19]
中确实包含 0
:s。请注意,由 realloc
分配的额外内存包含不确定的值,因此如果您的原始数组只有 11 个元素大,您在与 [=24=]
(或者最好是 0
) 你永远不会知道结果会是什么。它可以继续搜索 [=24=]
越界。
注意:完成后不要忘记free(k);
。
我的代码运行不清晰。我想给指针一个随机大小,我想向指针添加一些元素。我想给指针留足够大的地方。例如,如果我在指针中有 10 个元素,我想将 40 个字节的位置分配给指针。但是当我查看我的代码时,最初我为元素提供了如此大的尺寸。我想看到输出:
67
11
64
7
67
11
64
7
23
81
88
35
12
5
7
内存大小=40
#include <stdio.h>
#include <stdlib.h>
int main() {
int *k;
int i=0,j=0,t=0;
int array[20]={67,11,64,7};
k=malloc(5*sizeof(int));
k=array;
for(i=0;i<4;i++){
printf("%d\n",k[i]);
}
k=realloc(k,50*sizeof(int));
k[4]=23;
k[5]=81;
k[6]=88;
k[7]=35;
k[8]=12;
k[9]=5;
k[10]=7;
for(j=0;k[j]!='[=11=]';j++){
printf("%d\n",k[j]);
}
k=realloc(k,(j+1)*sizeof(int));
for(t=0;k[t]!='[=11=]';t++){
printf("%d\n",k[t]);
}
printf("the size of the memory=%d \n",j*4);
printf("the size of the memory=%d \n",t*4);
return 0;
}
您无法调整像 array
这样的自动变量的大小,这是您尝试做的事情,因为您这样做 k=array;
(并泄漏之前分配的内存)。
您可以将数据从 array
复制到 k
指出的已分配内存中:
int array[20] = {67, 11, 64, 7};
int *k = malloc(sizeof array);
memcpy(k, array, sizeof array);
虽然您使用的循环条件有点令人困惑:
for (j = 0; k[j] != '[=11=]'; j++)
我建议与 0
进行比较。
您最后打印的“内存大小”并不准确。最后分配的内存大小为(j+1)*sizeof(int)
,即12 * sizeof(int)
,因为k[11]
是第一个元素0
。
还有一个警告:您的程序当前已定义行为,因为数组在位置 [11, 19]
中确实包含 0
:s。请注意,由 realloc
分配的额外内存包含不确定的值,因此如果您的原始数组只有 11 个元素大,您在与 [=24=]
(或者最好是 0
) 你永远不会知道结果会是什么。它可以继续搜索 [=24=]
越界。
注意:完成后不要忘记free(k);
。