Lỗi dùng realloc() trong C

Mình đang học C, đến phần dùng malloc, calloc và realloc.

Mình có tạo 2 con trỏ và thêm giá trị cho chúng, sau đó dùng realloc để mở rộng.
Thì với con trỏ thứ nhất mọi thứ ok, đến con trỏ thứ 2 thì bị lỗi ko thêm được giá trị. Mọi người xem giúp mình với ạ.
Mình cảm ơn.

Sau khi dùng realloc để mở rộng con trỏ p1 và p2.
Nhập tiếp các phần tử thứ 6-10 của con trỏ p1 hoàn toàn bình thường.
Nhưng bắt đầu nhập phần tử thứ 6 của con trỏ p2 là bị lỗi như thế kia luôn. Rồi nó tắt đi chứ ko chạy code tiếp.

#include <stdio.h>
#include <stdlib.h>

/* run this program using the console pauser or add your own getch, system("pause") or input loop */

int main(int argc, char *argv[]) {
	//02 Tao mang ky tu su dung malloc, calloc, realloc
	//Khai bao 2 con tro p1 va p2:
	int *p1, *p2;
	p1 = (int*)malloc(5*sizeof(int));
	p2 = (int*)calloc(5, sizeof(int));
	int i;
	printf("Nhap cac phan tu cho mang 1:\n");
	for(i = 0; i<5; i++)
	{
		printf("Phan tu so %d la:", i+1);
		scanf("%d", p1+i);
	}
	printf("\nMang vua nhap la:\n");
	for(i = 0; i<5; i++)
	{
		printf("%d\t", *(p1+i));
	}
	
	printf("\nNhap cac phan tu cho mang 2:\n");
	for(i = 0; i<5; i++)
	{
		printf("Phan tu so %d la:", i+1);
		scanf("%d", p2+i);
	}
	printf("\nMang vua nhap la:\n");
	for(i = 0; i<5; i++)
	{
		printf("%d\t", *(p2+i));
	}
	//Dung realloc mo rong con tro p1:
	p1=(int*)realloc(p1, 10);
	//Them phan tu cho mang p1
	for(i = 5; i<10; i++)
	{
		printf("\nPhan tu so %d la:", i+1);
		scanf("%d", p1+i);
	}
	printf("\nMang vua nhap la:\n");
	for(i=0; i<10; i++)
	{
		printf("%d\t", *(p1+i));
	}
	
	//Them phan tu cho mang p2:
	p2=(int*)realloc(p2, 10);
	for(i = 5; i<10; i++)
	{
		printf("\nPhan tu so %d la:", i+1);
		scanf("%d", p2+i);
	}
	printf("\nMang vua nhap la:\n");
	for(i=0; i<10; i++)
	{
		printf("%d\t", *(p2+i));
	}
	return 0;
}

Lỗi kiểu gì? Bạn chỉ nói là không thêm được. Vù sao bạn biết nó không thêm được?

  • Vì khi chạy đến vòng lặp thêm thì chương trình báo lỗi.
  • Vì khi chạy đến vòng lặp thêm thì chương trình “đơ”, không cho nhập tiếp.
  • Vì sau khi nhập xong, in ra giá trị không đúng.
  • Vì sau khi nhập xong, không in ra gì.
  • Vì… BẠN MÔ TẢ CHI TIẾT GIÙM!
2 Likes

Đây bạn ơi.
Sau khi dùng realloc để mở rộng con trỏ p1 và p2.
Nhập tiếp các phần tử thứ 6-10 của con trỏ p1 hoàn toàn bình thường.
Nhưng bắt đầu nhập phần tử thứ 6 của con trỏ p2 là bị lỗi như thế kia luôn. Rồi nó tắt đi chứ ko chạy code tiếp.

` https://repl.it/repls/OutstandingUrbanLocks

10 trong realloc là 10 bytes bạn :smiley:
10 trong calloc là 10 slots nên code bạn tạch từ trước đó (trước khi thêm 5 phần tử vào đoạn 1).

4 Likes

Mình chưa hiểu lắm, vậy giờ phải sửa sao bạn :smiley:

À, hiểu rồi, chỗ đó phải nhân số block với số byte kiểu dữ liệu. Mình sửa được rồi :smiley:

Cảm ơn bạn nhé :smiley:

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?