banner

[Rule] Rules  [Home] Main Forum  [Portal] Portal  
[Members] Member Listing  [Statistics] Statistics  [Search] Search  [Reading Room] Reading Room 
[Register] Register  
[Login] Loginhttp  | https  ]
 
Forum Index Thảo luận hệ điều hành Windows Cấp phát bộ nhớ con trỏ lỗi ?  XML
  [Question]   Cấp phát bộ nhớ con trỏ lỗi ? 15/03/2013 10:54:00 (+0700) | #1 | 274102
[Avatar]
hoalong_317
Member

[Minus]    0    [Plus]
Joined: 15/05/2010 06:14:46
Messages: 6
Offline
[Profile] [PM]
Vì em không rõ lỗi chính xác có nằm ở việc cấp phát bộ nhớ con trỏ hay không nên em để tiêu đề chung chung, mong mọi người có thể giải đáp thắc mắc này, em có đoạn code sau :
Code:
#include <stdio.h>
#include <conio.h>
#include <ctype.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char *buffer = "demo%20bai tap";
char tempCode[3] = {0};
int j;
for(int i = 0;i< strlen(buffer);i++)
{
if(buffer[i] == '%')
{
tempCode[0] = buffer[i+1];
tempCode[1] = buffer[i+2];
buffer[i] = strtol(tempCode,NULL,16);
j = i +1;
do
{
buffer[j] = buffer[j+2];
}while(buffer[2+(j++)]);
}
}
printf("\n %s \n",buffer);
getch();
return 0;
}

trong đoạn code trên nếu thay khai báo char *buffer = "demo%20bai tap"; thành char buffer[20] = "demo%20bai tap"; thì chương trình lại chạy bình thường, về mặt bản chất cả 2 khai báo trên là tương đương nhau vậy tại sao cách khai báo thứ nhất lại bị lỗi và lỗi xuất hiện tại dòng code sau
Code:
buffer[i] = strtol(tempCode,NULL,16);
Học để nghiên cứu, làm việc để nghiên cứu
[Up] [Print Copy]
  [Question]   Cấp phát bộ nhớ con trỏ lỗi ? 15/03/2013 12:20:13 (+0700) | #2 | 274104
n2tforever
Member

[Minus]    0    [Plus]
Joined: 01/07/2011 15:39:51
Messages: 92
Offline
[Profile] [PM]
bản chất 2 khai báo trên không tương đương nhau.

với cách khai báo thứ nhất :
char *buffer = "demo%20bai tap";
ở đây trình dịch sẽ coi xâu "demo%20bai tap" là một resource và cất nó vào section .rdata sau đó cho buffer trỏ đến xâu này. do mặc định .rdata chỉ cho phép đọc nên khi bạn cố gắng ghi đè lên xâu cũ nó sẽ báo lỗi.

với cách khai báo thứ 2:
char buffer[20] = "demo%20bai tap";
trình dịch sẽ cấp phát một vùng nhớ 20 byte trên stack cho buffer, sau đó copy nội dung của xâu "demo%20bai tap" từ .rdata vào buffer. Do đó bạn có thể dọc ghi thoải mái trên buffer.
[Up] [Print Copy]
  [Question]   Cấp phát bộ nhớ con trỏ lỗi ? 16/03/2013 15:32:43 (+0700) | #3 | 274114
[Avatar]
startbkhn
Member

[Minus]    0    [Plus]
Joined: 25/09/2012 00:52:46
Messages: 57
Offline
[Profile] [PM]
char *buffer = "demo%20bai tap";
Đây là bạn lấy địa chỉ để lưu 1 giá trị cụ thể -> sai.
Bạn có thê tưởng tượng *buffer là 1 ô nhớ nào đấy trên máy tính, còn buffer[20] là 1 dãy ô nhớ 20 byte để lưu nội dung. Nếu *uuffer là cái địa chỉ nhà thì buffer là cái nhà rộng 20 byte.
Bạn muốn lưu nội dung vào thì hình như tớ nhớ ko nhầm bạn cần phải cất thế này:
**buffer: nghĩa là nội dung của con trỏ *buffer.
ví dụ demo cho bạn:
Code:
#include<iostream.h>
#include<conio.h>
int main()
{
    int a;
    int *b;
    cout<<"\nNhap b";
    cin>>*b;
    cout<<"b = "<<*b;
    cout<<"\nDia chi con tro b"<<b;
    getch();
    return 0;
}
>
Lương tâm trong sạch là mục đích theo đuổi cuối cùng
[Up] [Print Copy]
  [Question]   Cấp phát bộ nhớ con trỏ lỗi ? 17/03/2013 06:44:24 (+0700) | #4 | 274120
[Avatar]
hoalong_317
Member

[Minus]    0    [Plus]
Joined: 15/05/2010 06:14:46
Messages: 6
Offline
[Profile] [PM]

char *buffer = "demo%20bai tap";
Đây là bạn lấy địa chỉ để lưu 1 giá trị cụ thể -> sai.
 

Cái này không sai bạn à, con trỏ buffer ở trên dùng để trỏ tới vùng nhớ chứa chuỗi "demo%20bai tap" chứ không phải lấy địa chỉ của nó để lưu giá trị đó.

Bạn muốn lưu nội dung vào thì hình như tớ nhớ ko nhầm bạn cần phải cất thế này:
**buffer: nghĩa là nội dung của con trỏ *buffer.
 

Bạn lại nhầm về con trỏ rồi, khai báo **buffer là con trỏ trỏ tới con trỏ tức là buffer sẽ lưu địa chỉ của một con trỏ(bản chất con trỏ cũng là một biến nên nó cũng có địa chỉ trong ô nhớ) chứ không phải lưu nội dung của con trỏ , nội dung và địa chỉ là 2 cái khác nhau hoàn toàn
Theo như giải thích của bạn n2tforever là có cơ sở, tôi cũng thấy kì lạ khi không thể write vào vùng nhớ được
Học để nghiên cứu, làm việc để nghiên cứu
[Up] [Print Copy]
  [Question]   Cấp phát bộ nhớ con trỏ lỗi ? 17/03/2013 11:58:41 (+0700) | #5 | 274125
[Avatar]
Hatake_Kakashi
Member

[Minus]    0    [Plus]
Joined: 01/08/2012 21:37:08
Messages: 10
Offline
[Profile] [PM]
Data của chương trình thì có 2 loại là read-only và read-write. Có thể tham khảo ở đây http://en.wikipedia.org/wiki/Data_segment
Còn link này sẽ giải thích tại sao bạn bị lỗi http://c-faq.com/decl/strlitinit.html


Thân,
[Up] [Print Copy]
  [Question]   Cấp phát bộ nhớ con trỏ lỗi ? 17/03/2013 16:26:58 (+0700) | #6 | 274129
[Avatar]
chiro8x
Member

[Minus]    0    [Plus]
Joined: 26/09/2010 00:38:37
Messages: 661
Location: /home/chiro8x
Offline
[Profile] [PM] [Yahoo!]
1. Học lại các trình bày source.
2. Đọc lại pointer.

Code:
#include <stdio.h>
//#include <conio.h>
#include <ctype.h>
#include <stdlib.h>
#include <string.h>
int main()
{
	char *buffer;
	buffer = malloc(32);

	if(!buffer)return -1; //can't malloc
	strcpy(buffer, "demo%20bai tap");

	char tempCode[3] = {0};
	int j;
	int i;

	for(i = 0;i< strlen(buffer);i++)
	{
		if(buffer[i] == '%')
		{
			tempCode[0] = buffer[i+1];
			tempCode[1] = buffer[i+2];
			buffer[i] = strtol(tempCode,NULL,16);
			j = i +1;
			do
			{
				buffer[j] = buffer[j+2];
			}while(buffer[2+(j++)]);
		}
	}
	printf("\n %s \n",buffer);
	getchar();
	if(buffer)free(buffer);
return 0;
}
while(1){}
[Up] [Print Copy]
  [Question]   Cấp phát bộ nhớ con trỏ lỗi ? 17/03/2013 16:28:46 (+0700) | #7 | 274130
[Avatar]
chiro8x
Member

[Minus]    0    [Plus]
Joined: 26/09/2010 00:38:37
Messages: 661
Location: /home/chiro8x
Offline
[Profile] [PM] [Yahoo!]
Cái bạn khởi tạo được ngầm hiểu là const char*. Nên theo lý do các bạn ở trên đưa ra, nên nó lỗi do ghi lên vùng nhớ chỉ đọc.
while(1){}
[Up] [Print Copy]
  [Question]   Cấp phát bộ nhớ con trỏ lỗi ? 17/03/2013 18:44:18 (+0700) | #8 | 274132
[Avatar]
Hatake_Kakashi
Member

[Minus]    0    [Plus]
Joined: 01/08/2012 21:37:08
Messages: 10
Offline
[Profile] [PM]
Hồi mới ra trường đi phỏng vấn em bị hỏi câu này, trả lời không được bị fail về buồn không ăn cơm mấy ngày. Nhưng bù lại mình được kiến thức smilie
[Up] [Print Copy]
[digg] [delicious] [google] [yahoo] [technorati] [reddit] [stumbleupon]
Go to: 
 Users currently in here 
1 Anonymous

Powered by JForum - Extended by HVAOnline
 hvaonline.net  |  hvaforum.net  |  hvazone.net  |  hvanews.net  |  vnhacker.org
1999 - 2013 © v2012|0504|218|