Từ 1 tới 8 trên tổng số 8 kết quả

Đề tài: [VC] _itoa cần đối số char *string, nạp char * thì 0 được

  1. #1
    Ngày gia nhập
    08 2006
    Bài viết
    60

    Mặc định [VC] _itoa cần đối số char *string, nạp char * thì 0 được

    Xin chào mọi người ! Hiện tui có vấn đề này 0 hiểu. Nhờ giải thích dùm! Cám ơn nhiều !

    Code:
    char  *chuoi;
    
    char buffer[1];
    
    //chuoi="anh ueia";
    
     _itoa (size,chuoi,10);
    
    MessageBox(hDlg, chuoi ,"noi dung", MB_OK);
    MSDN cho biết thông tin về hàm _itoa như sau
    Code:
    char *_itoa( int value, char *string, int radix );
    Parameters
    value 
    Number to be converted 
    string 
    String result 
    radix 
    Base of value; must be in the range 2 – 36
    Chả hiểu sao đoạn lệnh trên khi chạy lại có lỗi. Thậm chí, nếu gán giá trị cho con trỏ chuoi thì vẫn 0 được
    Code:
    char  *chuoi;
    
    char buffer[1];
    
    chuoi="anh ueia";
    
     _itoa (size,chuoi,10);
    
    MessageBox(hDlg, chuoi ,"noi dung", MB_OK);
    Tui đã thử bỏ câu lệnh MessageBox nhưng vẫn có lỗi. Do vậy, câu lệnh gây lỗi là
    Code:
    _itoa (size,chuoi,10);

    Đoạn lệnh sau thì lại chạy được :
    Code:
    char  *chuoi;
    
    char buffer[1];
    
    //chuoi="anh ueia";
    
     _itoa (size,buffer,10);
    
    MessageBox(hDlg, buffer ,"noi dung", MB_OK);
    Tức là _itoa cần 1 hằng con trỏ thì phải ?

  2. #2
    Ngày gia nhập
    08 2006
    Nơi ở
    TpHCM
    Bài viết
    202

    vấn đề là ở chỗ này:
    char *chuoi = "abc";
    chuoi[0] = 'z'; //thử dòng này xem, phát biểu này không được phép

    trong itoa chắc chắn có chứa những lệnh gán như vậy để trả kết quả ra, tất nhiên như vậy là bị lỗi

    vì chuỗi hằng được cấp phát tại vị trí bộ nhớ được bảo vệ, đặc điểm này là do trình biên dịch VC, nên không được phép thay đổi

    có thể làm như sau mà không bị lỗi
    char chuoi[] = "abc"; //thay vì dùng char* thì dùng char[], cả 2 đều là con trỏ nhưng vẫn có sự khác nhau trong quá trình sử dụng (đây chỉ là 1 sự khác nhau giữa char* và char[] trong nhiều sự khác nhau khác)

    vì sao dùng char[] lại không bị lỗi, cái này cũng do trình biên dịch VC quyết định, tức là VC có thể vẫn cấp phát chuỗi hằng trong bộ nhớ được bảo vệ (có thể thôi nhé), nhưng chắc chắn là có tạo một vùng nhớ 4 byte cho biến "chuoi" (thế nen chuoi trong trường hợp này giống hệt như mảng), và khởi tạo nội dung cho mảng
    chuoi[0] = 'z'; //không bị lỗi

  3. #3
    Ngày gia nhập
    07 2006
    Bài viết
    166

    Trước hàm _itoa bạn cấp phát bộ nhớ cho biến con trỏ đó đi, thế này có sau đâu:
    Code:
    char *chuoi;
    ...
    chuoi = new char[9];
    _itoa(size, chuoi, 10);
    MessageBox(chuoi);

  4. #4
    Ngày gia nhập
    08 2006
    Bài viết
    60

    Tui hiện chưa thử lại.
    Tui cứ tưởng là _itoa tự tạo vùng nhớ. Sau đó, cho con trỏ chuoi trỏ tới vùng nhớ chứa kết quả. Vậy là _itoa thao tác trực tiếo trên chuoi, mà nó chưa được cấp phát vùng nhớ nên gặp lỗi.
    Cám ơn nhiều nhe !

  5. #5
    Ngày gia nhập
    07 2006
    Bài viết
    166

    Nói chung là chẳng có hàm nào tự cấp phát bộ nhớ cho tham số cả

  6. #6
    Ngày gia nhập
    09 2006
    Bài viết
    711

    Mặc định [VC] _itoa cần đối số char *string, nạp char * thì 0 được

    Tui là thành viên mới, xin có đôi chút ý kiến trả lời thắc mắc của bạn thuongshoo:
    1. Cú pháp của itoa đã nói rõ, char *string, tức string phải là một buffer (1 vùng memory) được cấp phát bởi coder, writable: ghi lên được.
    2. char *p = "xxx gì đó" và char p[] = "yyy gì đó" là hoàn toàn như nhau. Trong hầu hết các compiler hiện đại: Borland, VC, Intel..., vùng nhớ chứa "xxx gì đó" và "yyy gì đó" là vùng nhớ read only, compiler write content của 2 chuỗi này vào file .exe tại read only section (.rdata trong VC), và khi .exe được load, section này được đánh dấu là readonly, nên mọi tác vụ ghi, modify data trong section này sẽ gây lỗi (exception). Đó là lý do tại sao: p[0] = 'a' hay _itoa(size, p, xx) sẽ gây lỗi.
    Lỗi này thuộc dạng lỗi thuộc dạng tinh vi, khó tìm, gây crash chương trình. Tui đã gặp nhiều VC++ coder nhiều năm kinh nghiệm nhưng vẫn không biết rõ về lỗi dạng này.
    3. Với
    char buffer[1];
    _itoa (size,buffer,10);
    Bạn đã làm corrupt stack của hàm đang thực hiện đoạn code này.
    4. Giải pháp dùng new như bạn vinhie47 là đúng, nhưng đắt quá: chậm, phân mảnh memory, dễ memory leak...
    Tui thường dùng:
    // cấp phát buffer trên statck, clear content của nó luôn để tránh bug
    // Hàm itoa đòi hỏi buffer phải có thể chứa tối đa 33 char, +1 cho dấu -, +1 cho '\0'
    char buffer[35] = { 0 };
    _itoa(yourNumber, buffer, yourBase);
    5. Khi build ở TCHAR mode, dùng _itot. Trên VS 2003 về sau, nên dùng hàm secure _itot_s (_itoa_s hay _itow_s)
    Vài lời góp ý, có gì sơ sót mong bỏ qua.
    Đã được chỉnh sửa lần cuối bởi TQN : 27-09-2006 lúc 11:18 AM.

  7. #7
    Ngày gia nhập
    08 2006
    Nơi ở
    TpHCM
    Bài viết
    202

    có 1 sơ sót,
    2. không giống nhau đâu bạn, cái trước là readonly, nhưng cái sau thì #, mong về thử lại điều đó

  8. #8
    Ngày gia nhập
    09 2006
    Bài viết
    711

    Tui đã tìm hiểu về vấn đề này. Các trình compiler cũ như C++Builder (Borland C++), VC++6 thì cả hai constant chuỗi được save trong .data section, writeable. Nhưng với VC++ 2003 và VC++ 2005 thì trong .rdata section, readonly, kể cả tắt option C++ compiler: String pooling.

Các đề tài tương tự

  1. Tìm SV theo tên trong DSLK đơn, lỗi invalid conversion from `char' to `const char*'
    Gửi bởi dk411 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 9
    Bài viết cuối: 02-11-2011, 01:55 PM
  2. Bài tập C++ tạo toán tử ==trong lớp string với tham số là string, char
    Gửi bởi truonglong99 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 2
    Bài viết cuối: 24-10-2011, 08:56 AM
  3. xâu ký tự string và char *
    Gửi bởi trihn_kt trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 5
    Bài viết cuối: 15-05-2010, 09:01 AM
  4. string, char, Unicode char trong VC++
    Gửi bởi TQN trong diễn đàn Tutorials và Thủ thuật Visual C++
    Trả lời: 2
    Bài viết cuối: 09-03-2010, 01:35 PM
  5. char* string= new char[10]; làm sao để gán trị 0 cho 10 phần từ này
    Gửi bởi NLKNguyen trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 12
    Bài viết cuối: 03-04-2008, 03:34 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn