Cấp phát động cho mảng 1 chiều

#include <stdio.h>
#include <stdlib.h>
void nhapmang (int a[],int n);
void xuatmang (int a[],int n);
void xoa(int a[],int &n,int vt);
main()
{
	int n,vt,x;
	int *a;
	do
	{
		printf("Nhap so phan tu n:");
		scanf("%d",&n);
		if(n<0)
			printf("Nhap n >0\n");
	}while (n<0);
	a=(int *)malloc(n*sizeof(int));
	printf("\tNhapMang\n");
	nhapmang(a,n);
	printf("\tXuatMang\n");
	xuatmang(a,n);
	printf("\nNhap vt can xoa:");scanf("%d",&vt);
	xoa(a,n,vt);
	printf("\tXuatMang\n");
	xuatmang(a,n);
	printf("\n%5d",a[4]);
	free(a);
}
void nhapmang (int a[],int n)
{
	for(int i=0;i<n;i++)
		{
			printf("a%d=",i);
			scanf("%d",&a[i]);
		}
}
void xuatmang (int a[],int n)
{
	for(int i=0;i<n;i++)
		printf("%5d",a[i]);
}
void xoa(int a[],int &n,int vt)
{
	for(int i=vt;i<n-1;i++)
		a[i]=a[i+1];
	realloc(a, (n-1) * sizeof(int));
	n--;	
}

Hàm xóa phần tử mảng của mình , mặc dù đã realloc nhưng vẫn ko thế xóa vị trí của mảng

Khi bạn realloc lại 1 con trỏ hay 1 mảng thông qua hàm thì bạn phải tăng level của nó lên hoặc để tham chiếu cho nó, chứ chỉ để mỗi tham chiếu cho biến n thì đâu ăn nhằm gì. n không phải là kích thước của mảng đâu nhé, nó chỉ là con số tượng trưng cho kích thước của mảng thôi, nên tăng/giảm n không đồng nghĩa với việc kích thước của mảng sẽ tăng/giảm.
Nhưng bạn đang code C thì không nên dùng tham chiếu, thay vào đó là dùng con trỏ:

void xoa(int **a,int *n,int vt)
{
	for(int i = vt; i < n-1; ++i)
		(*a)[i] = (*a)[i+1];
	realloc(*a, (*n - 1) * sizeof(int));
	--(*n);
}

Còn thuật toán dùng trong code bạn tự kiểm tra nhé.

Cái này khá nguy hiểm vì khi a là mảng tĩnh mà bạn realloc thì… vì viết như vậy người ta vẫn feed mảng tĩnh vào đc.

Cái này mình cấp phát mảng động mà cậu

Nó tạo ra một ràng buộc là phải dùng mảng động mới đúng, trong khi xóa (kiểu dời chỗ) đâu có cần :smiley:

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