我想做这样的事情:
#include <stdio.h>
char * myfunction(char * in);
void myfunction2(char * in, const char ** content);
int main(){
char * name="aName";
char * result = myfunction(name);
return 0;
}
char * myfunction(char * in) {
const char *test = NULL;
myfunction2(in, &test);
return test; // I would like to return the value of test
}
void myfunction2(char * in, const char ** content) {
char input[1024];
//do some stuff to fill input
*content = input;
}
但我做不到,有时会打印一些奇怪的字符......
谢谢你的回复,我现在明白了,但我被困在问题的另一面。我没有准确地编写我的用例,所以我对其进行了编辑以使其完整。
最佳答案
这段代码中最明显的错误是:
myfunction
隐式声明为int myfunction();
- 您的指针的常量性不正确。
- 没有为
main()
提供返回值
myfunction
隐式声明为 int myfunction();
这很容易解决,当这种情况发生时,您的编译器应该大声对您咆哮。作为 C 的一项遗留功能,当遇到函数调用时,无论是通过原型(prototype)还是定义,都不知道正式声明,该函数被假定为返回 int
并接受可变数量的参数。因此,在 main()
中,您的调用被假定为一个如下所示的函数:
int myfunction();
稍后当遇到 real myfunction
时,至少你的编译器应该警告你声明如何不匹配预期的类型(因为这次它认为它是 int myfunction()
)。然而,即便如此,调用仍应通过,但依赖于此是很糟糕的做法。在使用前正确制作函数原型(prototype)。
所有指针的数据类型都不正确。
函数中的字符串文字未绑定(bind)到本地数组空间。它是一个只读数据缓冲区,位于程序数据 block 中某处的只读段中。正确的声明是这样的:
const char *test = "mytest";
但这会产生链式 react ,需要更改此代码的其余部分,稍后您就会看到。
没有为 main()
提供返回值
对 main()
的结论要明确。显然 C99 允许你跳过这个并且实现是应该为你返回 0。不要给他们那种快乐;自己捕获。
解决上述所有问题......
#include <stdio.h>
void myfunction(const char** in);
int main()
{
const char *result = NULL;
myfunction(&result);
printf("in main() %p : %s\n", result, result);
return 0;
}
void myfunction(const char** in)
{
const char* test = "mytest";
printf("in myfunction() %p : %s\n", test, test);
*in = test;
}
输出(因实现而异)
in main() 0x8048580 : mytest
in myfunction() 0x8048580 : mytest
关于C将char数组传递给函数,用另一个char数组计算并复制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21841534/