基本指针使用:分段错误,核心转储

时间:2017-03-25 21:49:47

标签: pointers segmentation-fault

我花了好几个小时在互联网上寻求帮助。我是指针使用的初学者,我已经遇到了问题:我不断收到错误Segmentation fault (core dumped)。我正在尝试使用指针创建一个简单版本的strncpy():

int main(int argc, char *argv[]) {
   char *x = "hello";                   /* string 1 */
   char *y = "world";                   /* string 2 */
   int n = 3;                           /* number of characters to copy */

   for (int i=0; i<=n; i++) {
      if(i<n) {
         *x++ = *y++;                   /* equivalent of x[i] = y[i] ? */
         printf("%s\n", x);             /* just so I can see if something goes wrong */
      } else {
         *x++ = '\0';                   /* to mark the end of the string */
      }
   }
}

(编辑:我初始化了x和y,但仍然遇到了同样的错误。)

在寻找这个错误的部分的过程中,我尝试了另一个简单的指针:

int main(int argc, char *argv[]) {
   char *s;
   char *t;
   int n;                               /* just initilaizing everything I need */

   printf("Enter the string: ");
   scanf("%s", s);                      /* to scan in some phrase */
   printf("%s", s);                     /* to echo it back to me */
}

瞧,我又得到了另一个Segmentation fault (core dumped)!它让我扫描“hello”,但回答了错误。这段代码很简单。我的指针在这里使用有什么问题?

2 个答案:

答案 0 :(得分:0)

在您的第二个示例中,您实际上并未分配任何内存。 char *s仅将指针分配给char。你需要以某种方式分配内存:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[]) {
   char s[100];
   printf("Enter the string: ");
   scanf("%s", s);                      /* to scan in some phrase */
   printf("%s", s);                     /* to echo it back to me */
}

char s[100]在堆栈上声明内存,它将自动解除分配。如果您想在堆上分配,请使用malloc / free

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[]) {
   char *s = malloc(100 * sizeof(char));
   printf("Enter the string: ");
   scanf("%s", s);                      /* to scan in some phrase */
   printf("%s", s);                     /* to echo it back to me */
   free(s);
}

当然,这些简单的例子假设你的字符串永远不会超过100个字符。

由于其他原因,您的第一个示例也失败了。

   char *x = "hello";
   char *y = "world";

这些语句在只读内存中分配字符串,因此您无法修改它。

答案 1 :(得分:0)

当您使用指向字符串的指针时,请始终记住您无法修改它。这意味着你无法改变字符串字符。在指向字符串的指针中,字符串总是进入只读存储器。它意味着只能读取内存而不能修改。 此语句导致段错误; -

*x++ = *y++;

你也不能这样做; -

int *p="cool";
 *p="a";         //dereferencing 
printf("%s",p); //segment fault