C:使用 printf 时出现分段错误

发布于 2024-09-04 10:33:21 字数 439 浏览 4 评论 0原文

这可能非常简单,但我似乎无法让它发挥作用。

我有这个非常简单的代码片段:

#include <stdio.h>
#include <string.h>

int main(void)
{

  char buf[100];
  char *p = buf;

  strcpy(p, "Test string");

  printf("%s\n", *p);

}

当我运行它时,它会导致分段错误。 GDB 输出:

Program received signal SIGSEGV, Segmentation fault.
0xb76af3b3 in strlen () from /lib/i686/cmov/libc.so.6

但我还是不明白。

评论将不胜感激,谢谢。

This one is probably very simple, but I can't seem to get it working.

I have this very simple snippet of code:

#include <stdio.h>
#include <string.h>

int main(void)
{

  char buf[100];
  char *p = buf;

  strcpy(p, "Test string");

  printf("%s\n", *p);

}

Which causes a segmentation fault when I run it. GDB outputs:

Program received signal SIGSEGV, Segmentation fault.
0xb76af3b3 in strlen () from /lib/i686/cmov/libc.so.6

But I still don't get it.

Comments would be appreciated, thanks.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

↙厌世 2024-09-11 10:33:21

当您写入时,

printf("%s\n", *p);

*p 将是 p[0] 处的值,它是一个字符。然而 printf 正在寻找一个字符数组,从而导致它出现段错误。请记住,在 C 中,字符串只是字符数组,而数组实际上是指向第一个元素的指针,这就是为什么您不需要取消引用。

要解决此问题,请删除 * 以获得:

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

When you write

printf("%s\n", *p);

the *p will be the value at p[0] which is a character. The printf however is looking for an array of chars, thus causing it to segfault. Remember that in C, strings are just arrays of characters, and arrays are effectively pointers to the first element, this is why you don't need to dereference.

To fix this remove the * to get:

printf("%s\n", p);
小…楫夜泊 2024-09-11 10:33:21

您正在将一个字符传递给 printf;你应该传递指针。

char buf[100];
char *p = buf;

strcpy(p, "Test string");

printf("%s\n", p);     // p, not *p

You're passing a character to printf; you should be passing the pointer.

char buf[100];
char *p = buf;

strcpy(p, "Test string");

printf("%s\n", p);     // p, not *p
宛菡 2024-09-11 10:33:21

使用这个:

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

使用“p”而不是“*p”

Use this:

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

use "p" instead of "*p"

你在看孤独的风景 2024-09-11 10:33:21

替换

printf("%s\n", *p);

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

当您使用 %s 时,printf 希望您传递 char*。您正在传递一个char

Replace

printf("%s\n", *p);

with

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

When you use %s, printf expects you to pass a char*. You are passing a char instead.

メ斷腸人バ 2024-09-11 10:33:21

只需传递字符串(指针):

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

如果要打印第一个字符,则:

printf("%c\n", *p);

just pass the string(the pointer):

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

If you want to print the first char, then:

printf("%c\n", *p);
终弃我 2024-09-11 10:33:21

%s 导致 printf() 取消引用 *p。假设字符串是“测试字符串”。
然后在我的 Solaris sparc 机器上:(在测试程序中)p 将“瞄准”地址 0x54657374。该特定地址成为进程空间一部分的概率接近于零。

这就是导致 SIGSEGV 信号(段错误)的原因。

%s causes printf() to dereference *p. Suppose the string was "Test string".
Then on my Solaris sparc box: (in a test program) p would be "aimed at" the address 0x54657374. The probability of that particular address being part of your process space is next to zero.

That is what caused the SIGSEGV signal (segfault).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文