我已经在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'周围的堆栈已损坏。
现在,我真的不知道我在那里做错了什么...... :(
答案 0 :(得分: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()
,但之后需要删除换行符。
答案 1 :(得分:2)
您不应该使用用户输入覆盖常量。将char str[] = ""
替换为char * str = malloc(<enough bytes for any possible input)
,或者甚至了解更安全的API。
答案 2 :(得分:1)
您只需分配一个字节来存储输入。这条线
char str[] = "";
为字符串内容分配零字节,为其空终止符分配一个字节。相反,做一些像
这样的事情char str[100];
或者无论最大输入长度是多少。
答案 3 :(得分:0)
这个答案适用于从Java / C#或其他一些现代面向对象语言来到C ++的每个人。
对我来说,这个问题的发生原因如下:
我创建了自己的自定义C ++类。
<强> MyClass.h 强>
class MyClass {
public:
void work();
};
<强> MyClass.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
只是私有属性,从此类外的代码中看不到。
问题原因是我没有将propA
和propB
放在MyClass.h
中。
当MyClass
被调用者实例化时,编译器不知道它应该分配多少内存。
我只是将标题添加到标题MyClass.h
:
MyClass.h(已修复)
class MyClass {
int64 propA, propB;
public:
void work();
};