现在我正在尝试创建一个函数,它接受一个字符串和一个字符的长度,它应该输出x个字符.
例如:
// char *string = "Hello"; (not actual code)
get_chars(strlen(string), "*"); // #=> *****
Run Code Online (Sandbox Code Playgroud)
但我一直在犯错误,我根本无法找到问题的解决方案.我正在使用的功能是:
char
*get_chars(int number, char *ch)
{
int i = 0;
char buffer[number];
for (i; i < number; i++)
{
buffer[i] = ch;
}
return buffer;
}
Run Code Online (Sandbox Code Playgroud)
当被调用时,产生:
assignment makes integer from pointer without a cast
Run Code Online (Sandbox Code Playgroud)
首先让我们检查你的函数的参数:
char *get_chars(int number, char *ch)
Run Code Online (Sandbox Code Playgroud)
好的,我们有一个方法接受一个数字,一个指向a的指针,char并返回指向a的指针char.现在该方法的目的是生成一个由相同char重复number次数组成的字符串,那么为什么要传递一个char*而不是一个char?
char*除非你真的想将指针传递给现有单个char而不是直接传递给角色,否则传递一个没有意义,但是我认为没有理由在你的情况下这样做,所以你的签名应该变成
char* get_chars(int number, char ch)
Run Code Online (Sandbox Code Playgroud)
现在,buffer[i] = ch;赋值不会产生任何问题,并且您的强制转换错误消失了.
然后让我们看看函数内部发生了什么:
char buffer[number];
...
return buffer;
Run Code Online (Sandbox Code Playgroud)
因此,可变长度数组被创建为堆栈上的局部变量,然后其地址衰减为char*指针,并返回该指针.但是从函数返回后,本地堆栈被清除,你刚刚返回的地址再也没有任何意义了.在这里你可以有两个解决方案:
char*由方法填充(并由调用者分配)free它第一个解决方案转换为:
void get_chars(char* buffer, int length, char ch) {
...
}
Run Code Online (Sandbox Code Playgroud)
虽然第二个解决方案是这样的:
char* get_chars(int length, char ch) {
char* buffer = calloc(length+1, 1);
...
return buffer;
}
Run Code Online (Sandbox Code Playgroud)
请注意我正在使用,length+1因为C字符串应该被NUL终止,\0或者任何库函数都无法知道它的结束位置.