【发布时间】:2021-11-05 18:22:08
【问题描述】:
最近我得到了一本 C 编程语言书。 在第 95 页有一个 strcpy 函数的实现。
void strcopy(char *s, char *t) {
while(*s++ = *t++)
;
}
int main(int argc, char *argv[]) {
char *hello = "hello";
char *world = "world";
strcopy(hello, world);
return 0;
}
我尝试自己实现它,但是在(成功)编译之后
gcc -o c_lang c_programming_lang_exercises.c
并尝试运行它
./c_lang
我收到以下错误消息:
zsh: bus error
我尝试了不同的实现,但不知何故这对我不起作用。
也许有人知道为什么?
感谢您的帮助:)
编辑: 为了我自己的理解,如果我错了,请纠正我。 在函数中调用“strcopy(hello, world);”我在这里传递指针本身的值,所以我用这样的东西调用函数:strcopy(0x123a4,0x234859b)。现在 C 不认为 this 是变量,因此它的值被复制并传递给函数。 在 strcopy 函数本身中,我无法取消引用它,因为我只是获取指针的值。
我应该做的是传递地址,指针引用,这样我就可以取消引用strcopy函数中的值并访问正确的内存地址。
另一个错误可能是我声明的主函数char *hello = "hello",据我所知,它称为字符串常量,因此不可修改。
所以,如果我的假设是正确的,下面的代码应该可以工作:
void strcopy(char *s, char *t) {
//code goes here...
}
int main(int stringc, char *argv[]) {
char hello[] = "hello";
char world[] = "world";
strcopy(&hello, &world);
return 0;
}
它可以工作,但我收到以下编译器警告:
incompatible pointer types passing 'char (*)[6]' to parameter of type 'char **' [-Wincompatible-pointer-types]
strcopy(&hello, &world);
【问题讨论】:
-
请说明您是如何在代码中调用该函数的。
-
你要传递什么给
s?字符串文字?请以文本形式发布Minimal Reproducible Example,这是显示问题的最短完整代码。 -
另请注意,您发布的代码有一个额外的
{。 -
你应该发帖minimal reproducible example。 如果按预期使用,该功能本身将起作用。
-
请注意,您的函数不符合该名称的 C 标准库函数。一方面,它应该返回传递的目标指针。