本帖最后由 mxwawaawxm 于 2020-9-20 20:00 编辑
之前看视频时,听到函数参数传递时,是值参递。也就是函数内部会新建一个变量存放实参的值
所以在main函数通过malloc函数动态分配内存,赋予了变量arr6个int大小的字节;而后在gen(int *arr)里调用realloc函数扩大内存,把它扩大到8个int
最后,居然外部的arr也跟着扩大了。而且gen函数内部、main函数外部运行的打印结果是一致的
[C] 纯文本查看 复制代码 #include <stdio.h>#include <stdlib.h>
#include <time.h>
void gen(int *arr);
void print_arr(int *arr, int num);
int main(int argc, const char *argv[])
{
srand(time(NULL));
int *arr = (int *)malloc(sizeof(int)*6);
gen(arr);
print_arr(arr, 8);
free(arr);
return 0;
}
void gen(int *arr)
{
int i;
for (i=0;i<6;i++) {
*(arr+i) = rand()%9+1;
}
arr = (int *)realloc(arr, sizeof(int)*8);
*(arr+6) = rand()%9+1;
*(arr+7) = rand()%9+1;
print_arr(arr, 8);
}
void print_arr(int *arr, int num)
{
int i;
printf("%s\n", __FUNCTION__);
for (i=0;i<8;i++) {
printf("%d ", *(arr+i));
}
printf("\n");
}
接着,做了个测试,在gen函数内部通过malloc函数动态分配内存,赋予temp变量2个int大小的字节,并赋值
最后再赋值给arr变量
结果,编译没报错。运行出现随机值
[C] 纯文本查看 复制代码 #include <stdio.h>
#include <stdlib.h>
#include <time.h>
void gen(int *arr);
void print_arr(int *arr, int num);
int main(int argc, const char *argv[])
{
srand(time(NULL));
int *arr = (int *)malloc(sizeof(int)*6);
gen(arr);
print_arr(arr, 8);
free(arr);
return 0;
}
void gen(int *arr)
{
int i;
int *temp = (int *)malloc(sizeof(int)*2);
for (i=0;i<2;i++) {
*(temp+i) = rand()%9+1;
}
for (i=0;i<6;i++) {
*(arr+i) = rand()%9+1;
}
arr = (int *)realloc(arr, sizeof(int)*8);
*(arr+6) = *(temp+0);
*(arr+7) = *(temp+1);
print_arr(arr, 8);
free(temp);
}
void print_arr(int *arr, int num)
{
int i;
printf("%s\n", __FUNCTION__);
for (i=0;i<8;i++) {
printf("%d ", *(arr+i));
}
printf("\n");
}
后面又再做了一次测试,依旧编译通过,但运行出错
[C] 纯文本查看 复制代码 #include <stdio.h>
#include <stdlib.h>
#include <time.h>
void gen(int *arr, int *temp);
void print_arr(int *arr, int num);
int main(int argc, const char *argv[])
{
srand(time(NULL));
int *arr = (int *)malloc(sizeof(int)*6);
int *temp = NULL;
gen(arr, temp);
print_arr(arr, 8);
free(arr);
free(temp);
return 0;
}
void gen(int *arr, int *temp)
{
int i;
temp = (int *)realloc(temp, sizeof(int)*2);
for (i=0;i<2;i++) {
*(temp+i) = rand()%9+1;
}
for (i=0;i<6;i++) {
*(arr+i) = rand()%9+1;
}
arr = (int *)realloc(arr, sizeof(int)*8);
*(arr+6) = *(temp+0);
*(arr+7) = *(temp+1);
print_arr(arr, 8);
}
void print_arr(int *arr, int num)
{
int i;
printf("%s\n", __FUNCTION__);
for (i=0;i<8;i++) {
printf("%d ", *(arr+i));
}
printf("\n");
}
后面两个测试代码,到底是哪里出错了,请大侠们指点下 |