我开始学习C中的指针。
如何修复函数x()
中的错误?
这是错误:
Error: a value of type "char" cannot be assigned to an entity of type "char *".
这是完整的来源:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>
void x(char **d, char s[]) {
d = s[0]; // here i have the problem
}
void main() {
char *p = NULL;
x(&p, "abc");
}
答案 0 :(得分:3)
在函数x()
中传递d
char **
(指向字符串指针的指针)和char s[]
(char
数组,传递方式与指向char
)的指针类似。
所以在行:
d = s[0];
s[0]
是char
,而char **d
是指向char
的指针。这些是不同的,编译器说你不能从一个分配到另一个。
但是,你的编译器真的警告你如下吗?
Error: a value of type "char" cannot be assigned to an entity of type "char *"
鉴于代码示例,最后应该说char **
。
我认为你要做的是x
做的是将作为第二个参数传递的字符串的地址复制到第一个指针中。那将是:
void x(char **d, char *s)
{
*d = s;
}
这使得调用者中的p
指向常量xyz
字符串,但不会复制内容。
如果想要复制字符串的内容:
void x(char **d, char *s)
{
*d = strdup(s);
}
并确保您记住free()
中main()
的返回值,并在顶部添加#include <string.h>
。
答案 1 :(得分:-1)
这是你可以做的,所以它会编译成两个版本。
第1版。
void x(char **d, char s[]) {
d = (char**)s[0];
}
或第2版。
void x(char **d, char *s) {
*d = s;
}
希望这有帮助。
答案 2 :(得分:-2)
更合适的方法是使用strcpy
:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>
void x(char **d) {
*d = malloc(4 * sizeof(char));
strcpy(*d, "abc");
}
int main() {
char *p;
x(&p);
printf("%s", p);
free(p);
return 0;
}
输出:abc