0

我正在玩数组和指针,并得到了这个分段错误。任何人都可以解释为什么我在代码中将指针“p”移动到代码中的“ptr”指针下方并且当我注释掉其中一个 printf 语句时,它会消失:

 typedef struct str{
   char* ptr;
  }str_t;

copy(str_t t){
   char a[12];
   char *p;   //  <------ no error when move below ptr pointer 
   char *ptr;

   printf("t= %s p = %d ptr = %d\n", t, p, ptr);

   strcpy(a, t.ptr);
   printf("a = %s %u\n", a, &a);

   strcpy(ptr, t.ptr);
   printf("ptr = %s %u\n", ptr, &ptr); //<--- comment it error disappears

   p= t.ptr;
   printf("p = %s %u",p, &p);  //<--- comment it error disappears
 }

int main ()
{
  str_t t;
  char app[] = "hello";
  char ap[] ="world";

  t.ptr = ap;
  copy(t);

  printf("%s\n", app);

  return 0;
}

您可以在此处编译代码以查看结果: http ://codepad.org/Q7zS8NaC

感谢您访问此问题。

4

2 回答 2

5

strcpy不在指针 , 处分配空间p来存储字符串。您需要将其声明为数组或使用 or 分配malloc空间calloc

尝试这个:

 int len = strlen (t.ptr);         // find length of string

 char * ptr = calloc (len + 1, 1); // allocate space for ptr
 if (!ptr) return;                 // error check calloc
 strcpy (ptr, t.ptr);              // copy the string

 char * p = calloc (len + 1, 1);   // do the same thing for p
 if (!p) return;
 strcpy (p, t.ptr);

这将解决您的分段错误。

不过,您还有几个错误,主要是格式问题。

  1. %u打印一个无符号整数。看起来您正在尝试打印指针,因此请%p改用。
  2. printf("t= %s p = %d ptr = %d\n", t, p, ptr);是完全错误的。
    1. 您需要引用 的成员t,即t.ptr
    2. p是指针,不是整数。使用%p代替%d
    3. ptr也是一个指针。使用%p%s

如果您不确定格式化,请阅读文档。printf事实上,如果您不确定如何使用它,请阅读任何功能的文档 - 您将为自己省去很多麻烦。

于 2013-10-18T03:12:34.973 回答
2

您的代码有几个未定义的行为:

  • 第一个使用说明符printf打印指针%d
  • 第二次调用strcpy尝试写入未初始化指针指向的内存
  • 第二次和第三次调用printf将指向数组的指针传递给格式说明符%u

删除其中一个指针使代码不会崩溃,但由于存在未定义的行为,代码无法正常工作,并且可能随时崩溃。

这是修复它的一种方法:

char a[12];
char *p;
char *ptr;

printf("t= %s p = %x ptr = %x\n", t.ptr, (void*)p, (void*)ptr);

strcpy(a, t.ptr);
printf("a = %s %x\n", a, (void*)(&a[0]));
ptr = malloc(strlen(t.ptr)+1);
// In production, check ptr for NULL
strcpy(ptr, t.ptr);
printf("ptr = %s %x\n", ptr, (void*)&ptr);

p= t.ptr;
printf("p = %s %x", p, (void*)&p);
// Release the memory when you are done
free(ptr);
于 2013-10-18T03:15:14.283 回答