这是我的代码示例:
#include <stdio.h>
#include <stdlib.h>
void foo(int size, int new_size, int * ptr1, double * ptr2) {
int i;
new_size = size * 2;
ptr1 = (int *) calloc(new_size, sizeof(int));
ptr2 = (double *) calloc(new_size, sizeof(double));
for (i = 0; i < new_size; i++) {
ptr1[i] = 1;
ptr2[i] = 2;
}
}
int main(){
int i, size = 4, new_size = 4;
int *ptr1 = NULL;
double *ptr2 = NULL;
foo(size, new_size, ptr1, ptr2);
for (i = 0; i < new_size; i++) {
printf("new_size: %d\n", new_size);
printf("ptr1: %d, ptr2: %f\n", ptr1[i], ptr2[i]);
}
free(ptr1);
free(ptr2);
return 0;
}
我必须使用malloc空间并在foo函数中将数据分配给ptr1和ptr2(因为我不知道它们在主要功能中的新大小)然后在主函数中使用它们。
为什么代码不起作用?以及如何实现我想要的上述流程?
答案 0 :(得分:3)
您可以将指针的地址传递给函数,如下所示:
void foo(int size, int new_size, int ** ptr1, double ** ptr2) {
int i;
new_size = size * 2;
*ptr1 = (int *) calloc(new_size, sizeof(int));
*ptr2 = (double *) calloc(new_size, sizeof(double));
for (i = 0; i < new_size; i++) {
(*ptr1)[i] = 1;
(*ptr2)[i] = 2;
}
}
并在主
foo(size, new_size, &ptr1, &ptr2);
您的代码无效,因为参数是按值传递的。作为指针的ptr1
和ptr2
仍然通过值传递,因此对它们的任何修改(与修改它们指向的内容相比)都不会保留在函数之后。
答案 1 :(得分:2)
传递指针的地址,修改函数中的指针以及所有这些,其他我对你的代码有一些观察
不要转换malloc()
的返回值,在c中不需要,以及hurts代码的可读性。
始终检查malloc()
的返回值以及几乎任何返回值的函数,因为通常会有一个特殊值表示失败,并且您不希望您的程序在特殊情况下行为不端
这是您自己代码的一个版本,主要问题已解决,以及上述观察结果。
#include <stdio.h>
#include <stdlib.h>
int foo(int size, int new_size, int ** ptr1, double ** ptr2) {
int i;
new_size = size * 2;
*ptr1 = malloc(new_size * sizeof(int));
*ptr2 = NULL;
if (*ptr1 == NULL)
return 1;
*ptr2 = malloc(new_size * sizeof(double));
if (*ptr2 == NULL) {
free(*ptr1);
return 2;
}
for (i = 0; i < new_size; i++) {
(*ptr1)[i] = 1;
(*ptr2)[i] = 2;
}
return 0;
}
int main() {
int i, size = 4, new_size = 4;
int *ptr1 = NULL;
double *ptr2 = NULL;
if (foo(size, new_size, &ptr1, &ptr2) != 0)
return -1;
for (i = 0; i < new_size; i++) {
printf("new_size: %d\n", new_size);
printf("ptr1: %d, ptr2: %f\n", ptr1[i], ptr2[i]);
}
free(ptr1);
free(ptr2);
return 0;
}
在c中你总是按值传递参数,它可能会让你感到困惑,因为你传递了一个指针,但指针只是另一个存储内存地址的变量,该地址在foo()
函数内部发生了变化,但它是只写入本地指针ptr1
。
传递地址会将值写入main()
中的原始指针。