我花了好几个小时在互联网上寻求帮助。我是指针使用的初学者,我已经遇到了问题:我不断收到错误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
”,但回答了错误。这段代码很简单。我的指针在这里使用有什么问题?
答案 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