这不起作用:
void function(char* var)
{
var = (char*) malloc (100);
}
int main()
{
char* str;
function(str);
strcpy(str, "some random string");
printf("%s\n", str);
return 0;
}
这样做:
void function(char* var)
{
//var = (char*) malloc (100);
}
int main()
{
char* str;
//function(str);
str = (char*) malloc (100);
strcpy(str, "some random string");
printf("%s\n", str);
return 0;
}
为什么?
答案 0 :(得分:13)
你必须传递指针的地址以分配你希望里面函数的地址,否则你只是传递它的副本:
void function(char** var)
{
*var = malloc (100);
}
int main()
{
char* str;
function(&str);
strcpy(str, "some random string");
printf("%s\n", str);
return 0;
}
答案 1 :(得分:4)
您需要使用指向指针的指针作为char **
的参数
当您将指针作为参数传递时,它会被复制,因此您在函数内部获得的只是指向同一位置的另一个指针。
您需要收到char **
并执行:
my_alloc_fun(void **ptr){
*ptr= malloc(size);
}
void *myptr;
my_alloc_fun(&myptr);
这样,你得到函数内部指针的地址,这样你就可以让原始指针指向新分配的内存。
答案 2 :(得分:3)
当您致电function(str)
时,您将str
的值传递给function
。此值是一些未初始化的垃圾值,因为您尚未将其设置为main
中的任何值,但这不是问题。
问题是function
有自己的指针var
,它将垃圾值放入其中,以便人们可以说var points to the same thing (garbage) that str points to
。但是,它们不是同一个变量。它们是两个不同的变量,更改var
对str
没有影响。
当您说var = (char*) malloc (100);
时,您正在某处分配内存,然后告诉var
指向它。现在var
指向与str
不同的位置。您立即从该函数返回,丢失var
以及该内存的位置。顺便说一句是内存泄漏。
当你返回main
时,str
就像往常一样 - 指向垃圾。
一个数字例子:
char *str; // str -> 0xfeedface (garbage)
function(str);
// inside 'function', an initialization like this occurs
char *var = str; // var -> 0xfeedface (same garbage)
var = (char*) malloc (100); // var -> 0x12341234 (alloc'd memory)
return;
// back in 'main'
strcpy(str, "some random string"); // str still points to 0xfeedface!
要正确执行此操作,您需要更改str
的值。这意味着function
需要指向str
的指针,或指向指针的指针。
void function(char **var)
{
*var = (char*)malloc(sizeof(char) * 100);
}
int main()
{
char *str;
function(&str);
strncpy(str, "some random string", 99);
...
free(str); // important in general
}
答案 3 :(得分:1)
指针就像任何其他变量一样;区别仅在于它们的价值所代表的含义。 double
具有表示双精度浮点数的值,而int
具有表示有符号整数的值,而指针具有表示另一个变量的位置的值。 / p>
指针本身仍然按值传递给其他函数;所以你的例子不能用于这个类似的功能不起作用的原因:
void function(int var)
{
var = 100;
}
int main()
{
int num;
function(num);
printf("%d\n", num);
return 0;
}
两种情况下的答案都是相同的:当function()
更改参数var
的值时,它只更改其本地副本 - 它不会更改{{1}内的变量1}}。
答案 4 :(得分:0)
请参阅我对C Programming: malloc() inside another function的回答,了解如何考虑这个问题。