01/10/2018, 09:34

Realloc trong C

Chào mọi người,
Em viết 1 chương trình C thuần túy. Đọc dữ liệu từ file .txt. Trong file (.txt) này là những con số Hexa 8-bit. Vd: 1A 2E 8F…
Mỗi lần đọc 1 số thì em thêm vào phần tử đuổi của mảng bằng lệnh realloc để resize lại kịch thước của mảng. Em dùng Visual Studio. Khi sử dụng trình Debug thì không báo lỗi, nhưng khi dùng Release thì bị lỗi nó ra 1 cái bảng Warming rồi bắt break, không chạy được. Em nghĩ là do truy cập vào vùng nhờ chưa được cấp phát. Mọi người xem giúp em với.

int main(int argc, char *argv[]) {
	FILE *FileIn;
	int i, temp;
	int *A, nA = 0;
	A = (int *)realloc(NULL, sizeof(int));
	FileIn = fopen("test.txt", "r");
	fscanf(FileIn, "%x", &temp);
	A[0] = temp;
	nA++;

	for(i = 0; i < 16; ++i){
		fscanf(FileIn, "%x", &temp);
		addValue(A, &nA, temp);
	}

	for (i = 0; i < 16; ++i) {
		printf("A[%d] = %x
", i, A[i]);
	}
	free(A);
	system("pause");
	return 0;
}

void addValue(int *A, int *n, int Data)
{
     A = (int *)realloc(A, (*n+1)*sizeof(int *));
     A[*n] = Data;
     (*n)++;
}
Trần Hoàn viết 11:37 ngày 01/10/2018

Mình chỉ show kết quả thôi nhé:
Relase:


Debug:

Ho Hai Dang viết 11:43 ngày 01/10/2018

ủa chứ bạn không biết câu trả lời hả =))

Ho Hai Dang viết 11:48 ngày 01/10/2018

Ờ cái debug không chạy được là do bạn thiếu file test.txt thì phải. Mình chẳng biết chương trình này sai chỗ nào :’(

Trần Hoàn viết 11:43 ngày 01/10/2018

Mình không học C nên cũng chẳng biết nó sai chỗ nào, chỉ là xem có giúp được gì không thôi í mà.

Khoa NTA viết 11:49 ngày 01/10/2018

Thật ra cái có vấn đề là hàm addValue. Vì bạn dùng realloc thì sau đó nó sẽ xin HĐH cấp 1 vùng nhớ khác có kích thước lớn hơn hoặc bằng cái bạn muốn, vì nó là vùng nhớ khác nên mọi thao tác làm thay đổi vùng nhớ này sẽ không ảnh hưởng đến mảng đầu vào, dễ hiểu hơn: không thể dùng kiểu tham biến. Giải pháp, sau khi thay đổi giá trị, return mảng A.

// Hàm addValue có dạng
int *addValue(int *A, int *n, int Data)
{
    /* Code... */
    return A;
}

Tại phần vòng lặp nhập giá trị, vì không lúc nào FileIn cũng đủ 16 số cho bạn, nên bạn dùng while và feof để kiểm tra:

while(!feof(FileIn)) {
     // Code
    A = addValue(A, &nA, temp);
}

// Sửa tương tự cho vòng lặp ở dưới vì mảng A không phải lúc nào cũng có 16 phẩn tử

Code đã chỉnh sửa
#include <stdio.h>
#include <stdlib.h>

int *addValue(int *, int *, int);

int main(int argc, char *argv[]) {
	FILE *FileIn;
	int i, temp;
	int *A, nA = 0;
	A = (int *)realloc(NULL, sizeof(int));
	FileIn = fopen("test.txt", "r");
	fscanf(FileIn, "%x", &temp);
	A[0] = temp;
	nA++;

	while(!feof(FileIn)) {
		fscanf(FileIn, "%x", &temp);
		A = addValue(A, &nA, temp);
	}

	for (i = 0; i < nA; ++i) {
		printf("A[%d] = %x\n", i, A[i]);
	}
	free(A);
	system("pause");
	return 0;
}

int *addValue(int *A, int *n, int Data)
{
     A = (int *)realloc(A, (*n+1)*sizeof(int));
     A[*n] = Data;
     (*n)++;
     return A;
}
Ho Hai Dang viết 11:48 ngày 01/10/2018

Chuẩn rồi. Cảm ơn bạn nhé

Bài liên quan
0