我花了几个小时在互联网上寻找帮助。我是指针使用的初学者,而且我已经遇到了一堵墙:我一直收到错误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