2014-10-04 24 views
5

Tôi đã gỡ lỗi mã của mình bằng công cụ Valgrind. Nó cho thấy lỗi này ở hàm này. Tôi đã đưa ra dưới đây lỗi và chức năng của tôi. Tôi không biết vấn đề ở đây là gì? Làm thế nào tôi có thể khắc phục nó? Lỗi của tôi là.Giá trị chưa được khởi tạo được tạo bởi phân bổ ngăn xếp

giá trị Uninitialised được tạo ra bởi một phân bổ đống tại 0x80996D7: cdtojd (std :: string const &)

Mã của tôi là.

double cdtojd(const string &cdate); 

double cdtojd(const string &cdate) 
{ 
    int dd,mm,yy; 
    int y,m; 
    double jd=0; 

    //mm = atoi(cdate.substr(0,2).c_str()); 
    //dd = atoi(cdate.substr(2,2).c_str()); 
    //yy = atoi(cdate.substr(4,4).c_str()); 

    sscanf(cdate.c_str(),"%2d%2d%4d",&mm,&dd,&yy); 

    //cout<<mm<<"..."<<dd<<"...."<<yy<<endl; 

    y = (yy - 1900) * 372; 

    m = (mm-1) * 31; 

    jd = dd + m + y; 

    return jd; 
} 
+2

Bạn đã xem xét việc kiểm tra lỗi sscanf()? –

+2

Kiểm tra xem sscanf có thành công không – Igor

Trả lời

3

Ý nghĩa của lỗi về bản chất là bạn đang sử dụng biến trước khi gán cho nó. Các biến duy nhất có thể áp dụng là dd, mm, yy.

Điều này có nghĩa là cuộc gọi sscanf của bạn không được viết cho cả ba người trong số họ. Điều này sẽ xảy ra nếu bạn vượt qua một ngày không được chỉ định hoàn toàn.

Lưu ý rằng sscanf trả về một giá trị để cho bạn biết số lượng biến mà nó đã ghi. Bạn nên kiểm tra giá trị trả lại, và hủy bỏ (hoặc điền vào một số giá trị mặc định) nếu nó không trả lại 3, bởi vì sau đó không phải tất cả các trường của bạn sẽ được lấp đầy.

+0

@SmithDwayne '"% 2d% 2d% 4d "' sẽ không làm những gì bạn nghĩ. Ngoài ra, ISO 8601 là định dạng ngày duy nhất được phép. – o11c

1

Không có lỗi khi kiểm tra sscanf và điều đó có nghĩa là một số biến có thể vẫn chưa được khởi tạo và sau đó được sử dụng, ví dụ:

std::string str = "invalid"; 
unsigned int dd,mm,yy; 
cout << dd << " " << mm << " " << yy << endl; 
cout << "Arguments read: " << sscanf(str.c_str(),"%2d %2d %4d",&mm,&dd,&yy) << endl; 
cout << dd << " " << mm << " " << yy; 

mã trên có thể phát ra như đầu ra:

32550 3249645428 32550 
Arguments read: 0 
32550 3249645428 32550 

nơi cả ba đối số vẫn chưa được khởi tạo.

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