如何正确传递指针参数和return?
How to passing the pointer parameters and return them right?
这是我的代码示例:
#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 space 并将数据分配给 foo 函数中的 ptr1 和 ptr2(因为我不知道它们在 main 函数中的新大小),然后在 main 函数中使用它们。
为什么代码不起作用?以及如何实现我想要的上述流程?
传递指针的地址,修改函数中的指针等等,除此之外我对你的代码有一些观察
不要强制转换 malloc()
的 return 值,这在 c 中没有必要,而且 hurts 您的代码可读性。
始终检查 malloc()
的 return 值以及几乎所有具有 return 值的函数,因为通常有一个特殊值表示失败,并且您不希望您的程序在异常情况下行为不端。
这是您自己的代码版本,解决了主要问题以及上述观察结果。
#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()
中的原始指针。
您可以像这样将指针的地址传递给函数:
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
虽然是指针,但仍然通过值传递,因此对它们的任何修改(与修改它们指向的内容相比)都不会保留在函数之后。
这是我的代码示例:
#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 space 并将数据分配给 foo 函数中的 ptr1 和 ptr2(因为我不知道它们在 main 函数中的新大小),然后在 main 函数中使用它们。
为什么代码不起作用?以及如何实现我想要的上述流程?
传递指针的地址,修改函数中的指针等等,除此之外我对你的代码有一些观察
不要强制转换
malloc()
的 return 值,这在 c 中没有必要,而且 hurts 您的代码可读性。始终检查
malloc()
的 return 值以及几乎所有具有 return 值的函数,因为通常有一个特殊值表示失败,并且您不希望您的程序在异常情况下行为不端。
这是您自己的代码版本,解决了主要问题以及上述观察结果。
#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()
中的原始指针。
您可以像这样将指针的地址传递给函数:
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
虽然是指针,但仍然通过值传递,因此对它们的任何修改(与修改它们指向的内容相比)都不会保留在函数之后。