7

我已经在 stackoverflow 看到了一些问题,但没有一个问题能解决我的问题......

我在 C 中有那个代码:


#include <stdio.h>
#include <stdlib.h>

int main ()
{
    char str[] = "";
    scanf("%[^\n]", str);
    printf("Você digitou: %s\n", str);
    system("pause");
}

当我运行程序时,我遇到了错误:

运行时检查失败 #2 - 变量“str”周围的堆栈已损坏。

现在,我真的不知道我在那里做错了什么...... :(

4

4 回答 4

6

给定它的初始化,该数组str只能保存一个。char调用scanf()将覆盖str导致未定义行为的边界,在这种情况下会破坏堆栈。您需要确定str数组的大小并限制读取的字符数以防止缓冲区溢出。

要使用scanf()您指定要读取的最大字符数:

char str[1024];
if (1 == scanf("%1023[^\n]", str)) /* Check return value to ensure */
{                                  /* 'str' populated.             */
}                                  /* Specify one less than 'str'  */
                                   /* size to leave space for null.*/

您也可以使用fgets(),但之后需要删除换行符。

于 2012-10-08T15:26:30.120 回答
2

您不应该用用户输入覆盖常量。替换甚至了解更安全的 API char str[] = ""char * str = malloc(<enough bytes for any possible input)

于 2012-10-08T15:23:38.363 回答
1

您只分配一个字节来存储输入。线

char str[] = "";

为字符串内容分配零字节,为其空终止符分配一个字节。相反,做类似的事情

char str[100];

或者无论最大输入长度是多少。

于 2012-10-08T15:27:13.367 回答
0

这个答案适用于从 Java/C# 或其他一些现代面向对象语言来到 C++ 的每个人。

对我来说,这个问题发生的原因如下:

我创建了自己的自定义 C++ 类。

我的类.h

class MyClass {

public:
    void work();

};

我的类.cpp

#include "MyClass.h"
#include <iostream>

class MyClass{
    int64 propA, propB;

    public:
        void work();

};

void MyClass::work() {
    // some work that uses propA and propB
}

我的直觉是,propA并且propB将只是私有属性,从此类外部的代码中看不到。

问题原来是我没有把propAand放进propBMyClass.hMyClass当被调用者实例化时,编译器不知道它应该分配多少内存。

我只是将属性添加到标题中MyClass.h

MyClass.h(固定)

class MyClass {
    int64 propA, propB;

public:
    void work();

};
于 2015-07-06T11:29:56.800 回答