【发布时间】:2014-02-14 04:09:37
【问题描述】:
几天前我不得不使用 C,在使用指针时我有点惊讶。
C 中的示例:
#include <stdio.h>
#include <stdlib.h>
void GetPointer(int* p) {
p = malloc( sizeof(int) );
if(p) {
*p = 7;
printf("IN GetPointer: %d\n",*p);
} else {
printf("MALLOC FAILED IN GetPointer\n");
}
}
void GetPointer2(int* p) {
if(p) {
*p = 8;
printf("IN GetPointer2: %d\n",*p);
} else {
printf("INVALID PTR IN GetPointer2");
}
}
int* GetPointer3(void) {
int* p = malloc(sizeof(int));
if(p) {
*p = 9;
printf("IN GetPointer3: %d\n",*p);
} else {
printf("MALLOC FAILED IN GetPointer3\n");
}
return p;
}
int main(int argc, char** argv) {
(void) argc;
(void) argv;
int* ptr = 0;
GetPointer(ptr);
if(!ptr) {
printf("NOPE\n");
} else {
printf("NOW *PTR IS: %d\n",*ptr);
free(ptr);
}
int* ptr2 = malloc(sizeof(int));
GetPointer2(ptr2);
if(ptr2) {
printf("NOW *PTR2 IS: %d\n",*ptr2);
free(ptr2);
}
int* ptr3 = GetPointer3();
if(ptr3) {
printf("NOW *PTR3 IS: %d\n",*ptr3);
free(ptr3);
}
return 0;
}
输出:
IN GetPointer: 7
NOPE
IN GetPointer2: 8
NOW *PTR2 IS: 8
IN GetPointer3: 9
NOW *PTR3 IS: 9
在此示例中,第一个指针将仅在 GetPointer 方法内具有“值”。为什么在内部使用malloc 只会在方法的生命周期内持续?
我在 C++ 中尝试过这个并得到了相同的行为。我以为它会保留它的价值,但没有。不过,我找到了解决办法:
void GetPointer(int*& p) {
p = new int;
if(p) {
*p = 7;
printf("IN GetPointer: %d\n",*p);
} else {
printf("MALLOC FAILED IN GetPointer\n");
}
}
在 C 语言中我无法做到这一点。有没有办法在 C 中做同样的事情,或者在尝试给它一个值之前我必须小心并“malloc”指针?
【问题讨论】:
-
如果要返回分配的内存地址,需要传入int** p。
-
谢谢大家的cmets!
-
与 StackOverflow 上的许多 C 问题一样,您应该回归基础。指针是一个值。调用函数会将参数的值复制到形参声明的变量中。指针是一个值,它具有间接运算符
*产生一个变量 的属性。&操作符则相反:接受一个变量并产生一个指针值。现在您已经掌握了解释观察到的行为所需的所有事实。一切都遵循这些简单的原则。 -
不客气。这里要理解的关键是将一个变量赋值给另一个变量会将源变量的值复制到与目标变量关联的存储中。无论赋值是由于赋值运算符还是传递与形式参数对应的参数,这都是正确的。您假设将一个变量分配给另一个使这两个变量共享一个存储空间。您有多个变量都称为
p,但它们都引用了不同的存储位置。
标签: c++ c pointers dynamic-memory-allocation