2012-10-08 21 views
5

Tôi đã nhìn thấy một số câu hỏi ở đây tại stackoverflow nhưng không ai trong số họ đã giải quyết vấn đề của tôi ...Run-Time Kiểm tra Failure # 2 - Stack xung quanh biến bị hỏng

tôi có mã trong C:


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

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

Khi tôi chạy chương trình, tôi đã có lỗi:

Run-Time Kiểm tra Failure # 2 - stack quanh variabl e 'str' bị hỏng.

bây giờ, tôi thực sự không biết những gì tôi đang làm sai có ... :(

Trả lời

5

mảng str chỉ có thể tổ chức một đơn char cho khởi động của nó. các cuộc gọi đến scanf() sẽ được ghi đè lên các giới hạn các str gây ra hành vi không xác định, trong trường hợp này phá huỷ các stack. Bạn cần phải quyết định như thế nào lớn mảng str nên và giới hạn số ký tự được đọc để ngăn chặn bộ đệm thừa n.

Để sử dụng scanf() bạn chỉ định số ký tự tối đa để đọc:

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.*/ 

Bạn cũng có thể sử dụng fgets() nhưng sẽ cần phải loại bỏ các kí tự xuống dòng sau đó.

2

Bạn không nên ghi đè lên một hằng số với người dùng nhập vào. Thay char str[] = "" với char * str = malloc(<enough bytes for any possible input) hoặc thậm chí tìm hiểu về API an toàn hơn.

1

Bạn chỉ phân bổ một byte để lưu trữ dữ liệu nhập. Dòng

char str[] = ""; 

Phân bổ zero byte về nội dung chuỗi và một byte cho terminator rỗng của nó. Thay vào đó, hãy làm điều gì đó như

char str[100]; 

Hoặc bất kỳ độ dài đầu vào tối đa nào sẽ là.

0

Câu trả lời này dành cho tất cả mọi người đến C++ từ Java/C# hoặc một số ngôn ngữ hướng đối tượng hiện đại khác.

Đối với tôi sự cố này đã xảy ra vì lý do sau:

Tôi đã tạo lớp C++ tùy chỉnh của riêng mình.

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 
} 

trực giác của tôi là propApropB sẽ chỉ đơn giản là tài sản riêng, vô hình từ mã bên ngoài lớp học này.

Vấn đề hóa ra là tôi chưa đặt propApropB trong MyClass.h. Trình biên dịch không biết số lượng bộ nhớ cần phân bổ khi MyClass được người gọi khởi tạo.

tôi chỉ cần thêm các thuộc tính vào tiêu đề MyClass.h:

MyClass.h (cố định)

class MyClass { 
    int64 propA, propB; 

public: 
    void work(); 

}; 
Các vấn đề liên quan