<![CDATA[Latest posts for the topic "[Question] Về vấn đề quản lý bộ nhớ với con trỏ trong C/C++"]]> /hvaonline/posts/list/23.html JForum - http://www.jforum.net [Question] Về vấn đề quản lý bộ nhớ với con trỏ trong C/C++ Code:
#include <iostream>
using namespace std;
int main()
{
        char xau1[]="Tran huy hoang";
        char *xau2="huy";
        char *xau;
        xau= strstr(xau1,xau2);
        strncpy(xau,"han",3);
        cout<<xau1<<endl;
        system("pause");
        return 0;
}
Anh ơi, sao khi khai báo: char xau1[]="Tran Huy Hoang" thì chương trình chạy được nhưng khai báo char *xau1="Tran Huy Hoang"; thì chương trình không chạy được. Em thấy hai khai báo này có gì khác nhau đâu ạ?   Thực sự là khi chạy chương trình, debug một hồi, không hiểu tại sao lỗi (dùng gcc và Code::Blocks để debug). Chỉ phát hiện lỗi nằm tại hàm strncpy. Lúc đầu là cứ nghĩ nguyên nhân là do việc thằng em này không cấp phát bộ nhớ cho con trỏ (đội mới học lập trình C/C++ rất hay bị lỗi đó) với lại để con trỏ chạy lung tung nên sinh lỗi. Sau đó, chuyển sang dùng VS C++ để debug thì mới phát hiện ra là lỗi Access Violation (tớ không nhớ lắm) đại khái là lỗi ghi vào vùng nhớ ko cho phép. Đọc tài liệu một lúc (ở http://www.gotw.ca/gotw/009.htm http://www.cs.bu.edu/teaching/cpp/string/array-vs-ptr/) thì tớ dự đoán nguyên nhân gây lỗi là thế này: - Khi khai báo là con trỏ thì toàn bộ cái xâu "Tran huy hoang" sẽ được quẳng trong cái vùng Const Data và con trỏ xau1 sẽ chỉ thẳng đến vùng nhớ đó. Đáng tiếc là vùng nhớ này là chỉ đọc (read-only) nên cái hàm strncpy khi được gọi sẽ cố gắng thay đổi dữ liệu trên vùng nhớ này (thay xâu "huy" = "hân") nên gây lỗi. - Khi khai báo là mảng, thì biến mảng xau1[] và dữ liệu được vứt vào Stack, vùng nhớ này có thể thay đổi được dữ liệu được nên khi gọi hàm strncpy sẽ ổn thỏa. Tớ muốn mạn phép hỏi là tớ dự đoán có gì không chính xác không, xin các bác chỉ giáo. Nếu sai toét, thì mong anh em cho biết rõ hơn về nguyên nhân gây lỗi. Tớ xin cảm ơn trước :D]]>
/hvaonline/posts/list/23880.html#143878 /hvaonline/posts/list/23880.html#143878 GMT
[Question] Về vấn đề quản lý bộ nhớ với con trỏ trong C/C++

K4i wrote:
Hi anh em, Hôm nay tớ nhận được một cái mail của thằng em gửi cho như sau:
Code:
#include <iostream>
using namespace std;
int main()
{
        char xau1[]="Tran huy hoang";
        char *xau2="huy";
        char *xau;
        xau= strstr(xau1,xau2);
        strncpy(xau,"han",3);
        cout<<xau1<<endl;
        system("pause");
        return 0;
}
Anh ơi, sao khi khai báo: char xau1[]="Tran Huy Hoang" thì chương trình chạy được nhưng khai báo char *xau1="Tran Huy Hoang"; thì chương trình không chạy được. Em thấy hai khai báo này có gì khác nhau đâu ạ?  
Thực sự là khi chạy chương trình, debug một hồi, không hiểu tại sao lỗi (dùng gcc và Code::Blocks để debug). Chỉ phát hiện lỗi nằm tại hàm strncpy. Lúc đầu là cứ nghĩ nguyên nhân là do việc thằng em này không cấp phát bộ nhớ cho con trỏ (đội mới học lập trình C/C++ rất hay bị lỗi đó) với lại để con trỏ chạy lung tung nên sinh lỗi. Sau đó, chuyển sang dùng VS C++ để debug thì mới phát hiện ra là lỗi Access Violation (tớ không nhớ lắm) đại khái là lỗi ghi vào vùng nhớ ko cho phép. Đọc tài liệu một lúc (ở http://www.gotw.ca/gotw/009.htm http://www.cs.bu.edu/teaching/cpp/string/array-vs-ptr/) thì tớ dự đoán nguyên nhân gây lỗi là thế này: - Khi khai báo là con trỏ thì toàn bộ cái xâu "Tran huy hoang" sẽ được quẳng trong cái vùng Const Data và con trỏ xau1 sẽ chỉ thẳng đến vùng nhớ đó. Đáng tiếc là vùng nhớ này là chỉ đọc (read-only) nên cái hàm strncpy khi được gọi sẽ cố gắng thay đổi dữ liệu trên vùng nhớ này (thay xâu "huy" = "hân") nên gây lỗi. - Khi khai báo là mảng, thì biến mảng xau1[] và dữ liệu được vứt vào Stack, vùng nhớ này có thể thay đổi được dữ liệu được nên khi gọi hàm strncpy sẽ ổn thỏa. Tớ muốn mạn phép hỏi là tớ dự đoán có gì không chính xác không, xin các bác chỉ giáo. Nếu sai toét, thì mong anh em cho biết rõ hơn về nguyên nhân gây lỗi. 
Bác đã dự đoán chính xác. Bác có thể viết một hàm rất đơn giản chỉ chứa mỗi lệnh char xau1[]="Tran huy hoang"; hay char *xau1 = "Tran huy hoang"; compile rồi decompile nếu muốn thấy tận mắt sự khác nhau này. ]]>
/hvaonline/posts/list/23880.html#143884 /hvaonline/posts/list/23880.html#143884 GMT
Re: [Question] Về vấn đề quản lý bộ nhớ với con trỏ trong C/C++ /hvaonline/posts/list/23880.html#143885 /hvaonline/posts/list/23880.html#143885 GMT Re: [Question] Về vấn đề quản lý bộ nhớ với con trỏ trong C/C++ Code:
char *xau1 = "Tran huy hoang";
    xau1[0] = 't';
cũng báo lỗi nên mới phán thế :D. Cơ bản là lâu không code lại C/C++ với lại chỉ biết mỗi Stack với Heap nên không chắc chắn lắm. Phải nhờ các bác có kinh nghiệm chỉ giúp]]>
/hvaonline/posts/list/23880.html#143886 /hvaonline/posts/list/23880.html#143886 GMT
Re: [Question] Về vấn đề quản lý bộ nhớ với con trỏ trong C/C++ /hvaonline/posts/list/23880.html#143946 /hvaonline/posts/list/23880.html#143946 GMT Re: [Question] Về vấn đề quản lý bộ nhớ với con trỏ trong C/C++

TQN wrote:
Compile = compiler nào, version mấy ? 
Đầu tiên là MinGW v4.1, sau đó em vác sang Visual Studio C++ 2008 Express Edition dịch. Có chuyện gì ko bác :-?]]>
/hvaonline/posts/list/23880.html#143951 /hvaonline/posts/list/23880.html#143951 GMT
Re: [Question] Về vấn đề quản lý bộ nhớ với con trỏ trong C/C++ /hvaonline/posts/list/23880.html#143997 /hvaonline/posts/list/23880.html#143997 GMT