【问题标题】:Unexpected output of printf for a string in CC 中字符串的 printf 意外输出
【发布时间】:2016-11-30 22:07:21
【问题描述】:

案例 1: 当我接受字符串输入时,它成功地给出了输出,写了这段代码:

#include <stdio.h>
int main()
{
    char *str;
    scanf("%s",&str);
    printf("%s",&str);
    return 0;
}

案例 2: 另一方面,它会为此 sn-p 引发运行时错误:

#include <stdio.h>
int main()
{
    char *str;
    scanf("%s",&str);
    printf("%s",str);
    return 0;
}

我发现这件事很奇怪,想知道为什么会这样…… 提前致谢。

【问题讨论】:

  • 阅读字符串指针数组动态内存分配以及格式规范。阅读有关未定义行为的内容,锦上添花。
  • 这里的东西内存不足,那就是str
  • 除了您没有为str 分配内存这一事实之外,案例2 是正确的实现。在使用之前添加str = malloc(50); 或类似名称。在情况 1 中你很幸运,只是爆破了一些不属于你的记忆。
  • 暂时假设案例 1 是正确的。是什么让您认为在案例 2 中您不需要使用 &amp; - 案例 1 和案例 2 不可能都是正确的。你不能一边走一边弥补。您需要使用正确的类型。
  • 谢谢大家,感谢您的回答,我会改正自己的

标签: c pointers char-pointer


【解决方案1】:

这两种情况都不对。

案例 1 之所以有效,是因为您很幸运,可能是通过提供 short 字符串作为输入。尝试"bfjabfabjkbfjkasjkvasjkvjksbkjafbskjbfakbsjfbjasbfjasbfkjabsjfkbaksbfjasbfkja" 之类的方法,您很可能会遇到段错误。

您应该有一个与str 关联的内存块,可以通过为其声明一个数组在堆栈上或在堆上为它声明malloc'ing 内存。

而且您不应该使用&amp; 运算符。

所以它会是这样的:

#include <stdio.h>
int main()
{
    char str[50];   // 50 is arbitrary
    scanf("%s",str);
    printf("%s",str);
    return 0;
}

或者像这样:

#include <stdio.h>
#include <stdlib.h>
int main()
{
    char* str = malloc(50);   // 50 is arbitrary
    scanf("%s",str);
    printf("%s",str);
    free(str);
    return 0;
}

【讨论】:

  • 非常感谢@YuriLaguardia
  • @yano 哎呀。绝对!
  • 对不起@yano。我是 StackOverflow 的新手,所以不太习惯。感谢您与我分享正确的代码 :)
  • @UddalakBhaduri 不用感谢我(或者需要道歉..?)这是所有 Yuri 的代码!只要您正在学习重要的东西,就不要让反对票让您失望。你被 DVed 是因为这样的问题已经被问过很多次了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-15
  • 1970-01-01
  • 2012-11-08
相关资源
最近更新 更多