我想在我作为函数的参数传递的指针中存储char类型的结果。像这样:
#include<stdio.h>
void try(char *);
int main()
{
char *result;
try(result);
printf("%s",result);
return 0;
}
void try(char *result)
{
result="try this";
}
但我得到了结果:(null)
有人能告诉我这里有什么问题吗?
答案 0 :(得分:2)
您的语法只发送指向该函数的指针。这允许更改指针指向的数据,但不能更改指针本身。
你需要
void try(char **result)
并将其命名为
try(&result);
更改实际指针。
另一种方法是将数据复制到指针指向的内存中,但是您需要知道有足够的可用内存。取决于实际用例如何正确执行。你可以使用
strcpy(result, "what you want");
然后你真的必须知道result
指向的内存可以处理14个字符(记住最后的NULL)。在您当前的代码中,您根本不会为结果分配内存,因此这将调用未定义的行为。
您看到NULL的原因是您的编译器决定将未分配的指针初始化为NULL。另一个编译器可能会将它们初始化为随机值。
关于术语,您不会将类型char存储到指针中。你可能有一个指向char的指针,或者在这种情况下指向一个C类型的字符串,这是一个字符数组。
答案 1 :(得分:1)
您正在result
函数中创建另一个变量try
。
尝试在result
功能中打印try
。它会工作。
如果你真的想在main
内打印,那就试试吧 -
#include<stdio.h>
void try(char **);
int main()
{
char *result;
try(&result);
printf("%s",result);
return 0;
}
void try(char** result)
{
*result = "try this";
//printf("%s\n",result);
}
或者,如果你不想进入双指针,那么这将有效:
#include<stdio.h>
char* try(char *);
int main()
{
char *result;
result = try(result);
printf("%s",result);
return 0;
}
char* try(char* result)
{
result = "try this";
return result;
}
答案 2 :(得分:0)
另一种方式(没有动态内存):
View v
注意:当你说你得到null时,这并不意味着什么 - 实际上你有未定义的行为 - 因为#include<stdio.h>
void try(char *);
int main()
{
char result[100] = {0};
try(result);
printf("%s",result);
return 0;
}
void try(char *result)
{
strcpy(result,"try this");
}
没有被初始化。我猜你甚至在尝试打印result
之前调用了UB,即当你将它传递给result
时。因为将在指针的该方法中进行复制,这将尝试读取原始指针的值 - 读取未初始化的变量在C中是未定义的。因此总是在C中初始化变量。