hỏi về cách sử dụng hàm malloc() trong một function()

mình có viết một chương trính tính lãi ngân hàng như thế này

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
void bank(float tien,float nam,float lai);
int main()
{
	float nam=0;
	float sotien=0,lai=0;
	printf("xin chao mung ban den voi ngan hang cua chung toi :\n\n");
	printf("moi ban nhap so tien ban muon gui :");
	scanf("%f",&sotien);
	printf("muc lai suat ma ban mong muon :");
	scanf("%f",&lai);
	printf("so nam ban muon gui tien o ngan hang cua chung toi :");
	scanf("%f",&nam);
	bank(sotien,nam,lai);
	getchar();
	return 0;
}
void bank(float tien,float nam,float lai)
{
	float *n=NULL;
	float *s=NULL;
	n=malloc(nam*sizeof(float));
	s=malloc(nam*sizeof(float));
	for(int i=0;i<nam;i++)
	{
		n[i]=tien*lai/100;
		tien=tien+n[i];
		s[i]=tien;
	}
	for(int i=0;i<nam;i++)
	{
		printf("so tien lai sau moi nam %d la :%.3f\n",i+1,n[i]);
		printf("tong so tien cua %d la :%.3f\n",i+1,s[i]);
	}
	free(n,s);
}

trong hàm void bank
mình có dùng
n=malloc(namsizeof(float));
s=malloc(nam
sizeof(float));
mà nó toàn báo hai dòng này không hợp lệ à vậy hai dòng này sai ở đâu vậy mọi người rất mong được mọi người chỉ giáo

malloc có parameter kiểu size_t mà sao bạn chưa ép kiểu nam rồi mới truyền vào tính toán.

free(n,s); sao free thoải mái vậy ^^

1 Like

ep kieu cho nam ve kieu gi ha ban

n =(float*) malloc((size_t)nam*sizeof(float));
s = (float*)malloc((size_t)nam*sizeof(float));
1 Like

cai size_t la de lam gi ha ban

mà trong một taig liệu mình đọc nó toàn ghi thế này thôi bạn à

int soluongbanbe=0;
scanf("%d",&soluongbanbe);
int *banbe=NULL;
banbe=malloc(soluongbanbe*sizeof(int))

size_t là một kiểu thôi, nó tương đương unsigned int nhưng chủ yếu được dùng để biểu thị size của object (biến, array, struct…)

sizeof trả về kiểu size_t nên bạn nên ép kiểu nam về size_t rồi mới tính toán.

Hàm free chỉ truyền vào một đối số sao bạn lại truyền vào nhiều hơn ???

1 Like

@BetapCode chỉ giáo thêm nha bạn thanh nhiều

sao trong scah cua minh no chi viet la

int *a=NULL;
a=malloc(n*sizeof(int)

chứ nó không viết như ban đâu à

Chương trình bạn ok mà, chỉ sai ở chỗ free chỉ có 1 parameter thôi
free(void * ptr);

1 Like

nó báo lỗi ở hai dòng này này

n=malloc(nam*sizeof(float));
s=malloc(nam*sizeof(float));

lỗi là bạn đã convet không hợp lệ à
sửa như bạn @BetapCode

n =(float*) malloc((size_t)nam*sizeof(float));
s = (float*)malloc((size_t)nam*sizeof(float));

thì lại chạy ok à

Bạn biên dịch C bằng C++ Compiler phải ko :?
C++ thì nó bắt ép kiểu kỹ càng lắm.
Còn C thì cứ tung tăng mà mần. :))
http://ideone.com/ns1Nlt

1 Like

mình đang dùng c mà
mà cũng kỳ lại nếu viết như thế này trong hàm main()
thì ok vô cùng luôn nó chạy

n=malloc(nam*sizeof(float));
s=malloc(nam*sizeof(float));

sang hàm khác thì nó lại không chay và báo lỗi liên tuc bạn à @drgnz

mình dùng code block bạn à

bạn à @BetapCode mình vừa bỏ size_t của bạn đi vẫn chạy bình thường bạn à không cần nó vẫn chạy à

Mình đâu có bàn về chuyện “chạy được” và không “chạy được”.

Bạn đọc kĩ về những thứ mình đã đề cập ở trên nhé.

Tập viết code kĩ và đúng chuẩn như vậy tăng thêm kiến thức mà còn tránh được bug nữa :slight_smile:

Sách gì mà lại không ép kiểu con trỏ trả về của malloc luôn, bỏ sách đó đi nhé ^^

2 Likes

chuan roi ban à cảm ơn bạn mình để đuôi là cpp nên nó để thoe c++ bạn à sang c cái thì không cần thanh you i love you @drgnz

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