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



我花了几个小时在互联网上寻找帮助。我是指针使用的初学者,而且我已经遇到了一堵墙:我一直收到错误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("%sn", x);             /* just so I can see if something goes wrong */
      } else {
         *x++ = '';                   /* 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",但回复了错误。这段代码非常简单。我的指针在这里使用有什么问题?

在第二个示例中,您实际上没有分配任何内存。 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";

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

当您使用指向字符串的指针时,请始终注意您无法修改它。这意味着您无法更改字符串字符。在"指向字符串的指针"中,字符串始终转到只读内存。这意味着内存只能读取以修改。此语句导致段故障;-

*x++ = *y++;

你也不能这样做;

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

相关内容

  • 没有找到相关文章

最新更新