当我试图解决Dennis Ritchie的问题时。我收到以下错误。但是我不知道为什么会这样。好像它应该工作。 我正在使用MacOS Mojave和标准gcc编译器。 我的源代码如下。
#include <stdio.h>
#include <string.h>
// copies most n characters of t to s;
char *sstrcnpy(char *s, char *t, int n)
{
// *pointer - content of the pointer will be assigned
char *ret; // ret stores the content of the dst
while(n--){
*ret++ = *t++;
}
printf("%s\n", ret);
return ret;
}
int main()
{
char *s = "Destination";
char *t = "sour";
char *sstrcnpy(char *s, char *t, int n);
sstrcnpy(s,t,3);
printf("%s\n", s);
return 0;
}
然后,当我尝试运行此代码时。终端给了我以下错误。
nasantogtokhs-MacBook-Pro:C nasaa$ ./5_5
Segmentation fault: 11
或者不是分段错误,而是其他一些源代码
bus error: 10
然后,我尝试使用Mac的 lldb 进行深入研究。然后我得到以下错误。
* thread #1, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=1, address=0x0)
frame #0: 0x0000000100000ef7 5_5`sstrcnpy(s="Destination", t="our", n=2) at exercise_5_5.c:10
7 // *pointer - content of the pointer will be assigned
8 char *ret; // ret stores the content of the dst
9 while(n--){
-> 10 *ret++ = *t++;
11 }
12 printf("%s\n", ret);
13 return ret;
我认为这与内存访问有关。似乎我的计算机以某种方式不允许在单独的函数中将值分配给指针内容。但是我看到了其他例子。似乎应该可以正常工作。
谢谢您的时间。
答案 0 :(得分:0)
我知道了。显然,当我初始化char的指针时,无法更改它,但是如果我们为其分配内存,则可以更改内容。 我认为该错误的原因是,当我通过将其显式分配给char数组进行初始化时,该程序正尝试访问不可接受的内存块并尝试更改它,这是正确的,因为初始化只是常量地址的映射在内存中指向指针。并且当使用动态内存分配时,在分配给指针的内存中开头没有常量,并且strcpy函数很好地复制了字符。