如何解决无法根据用户的字符串动态分配内存; realloc:下一个大小无效
我正在尝试最小化以下程序的内存分配。我试图动态分配内存的整个思路是
- 为30个字节的用户字符串输入动态分配内存
- 如果用户的输入大于分配的内存,请调用realloc()函数以使字符串适合101个字节
- 如果用户的输入大于100个字节,请调用exit()并终止程序。
当我实现realloc()函数以检查用户输入是否适合动态分配的char数组(与calloc一致)时,我的程序失败,并显示以下输出:
realloc(): invalid next size
Aborted (core dumped)
我不确定该如何解决。
代码:
#include <stdio.h> //gets() was removed from this library
#include <stdlib.h> //for calloc()
#include <string.h> //for strlen()
#include <unistd.h> //for sleep(2)
int len = 0;
struct item
{
//i cant make sure pointer points to nothing because structures are only a templates.
//i cant do operations here!!!!!!!
char *itemName;
int qty;
float price;
float amount;
};
int readItem(struct item *pProduct)
{
printf("hey,what is the product name: ");
gets(pProduct->itemName);
//checking whether user's input fits into the allocated pointer size
len = strlen(pProduct->itemName);
printf("%d\n\n",len);
if (len > 30)
{
//error here
pProduct->itemName = (char *)realloc(pProduct->itemName,101);
printf("\nyour input is too big. re enter it\n");
gets(pProduct->itemName);
if (pProduct->itemName == NULL)
{
puts("memory is not avaible");
exit(1);
}
len = strlen(pProduct->itemName);
printf("%d\n\n",len);
if (len > 100)
{
puts("memory is not avaible");
exit(1);
}
}
printf("\nEnter the product quantity: ");
scanf("%d",&pProduct->qty);
printf("\nEnter the product price: ");
scanf("%f",&pProduct->price);
//calculating the amount
pProduct->amount = (float)pProduct->qty * pProduct->price;
return 0;
}
void printItem(struct item *pProduct)
{
puts("\n\nthe database:");
sleep(1);
printf("----------------------\n");
printf("Name: \"%s\"\n",(*pProduct).itemName);
printf("Price: %.2f\n",pProduct->price);
printf("Quantity: %d\n",pProduct->qty);
printf("Amount: %.2f\n",pProduct->amount);
printf("----------------------\n");
}
int main()
{
//assigning variable product and piinter pProduct to a tag name item,struct item product,*pProduct = NULL;
//storing an address to a pointer pProduct
//making a structure to a pointer
pProduct = &product;
//(char *) is casting char to a pointer type
pProduct->itemName = (char *)calloc(30,sizeof(char));
readItem(pProduct);
printItem(pProduct);
free(pProduct->itemName);
pProduct->itemName = NULL;
pProduct = NULL;
return 0;
}
我知道REALLOC确实会造成麻烦。更准确地说,如果我输入34个字符,realloc似乎可以工作,但是如果将其加倍至68,尽管realloc中提到了大小,它仍会引发错误
我对调用栈的了解为零,但这对某人可能有用:
libc.so.6!__GI_raise(int sig) (/build/glibc-YYA7BZ/glibc-2.31/sysdeps/unix/sysv/linux/raise.c:50)
libc.so.6!__GI_abort() (/build/glibc-YYA7BZ/glibc-2.31/stdlib/abort.c:79)
libc.so.6!__libc_message(enum __libc_message_action action,const char * fmt) (/build/glibc-YYA7BZ/glibc-2.31/sysdeps/posix/libc_fatal.c:155)
libc.so.6!malloc_printerr(const char * str) (/build/glibc-YYA7BZ/glibc-2.31/malloc/malloc.c:5347)
libc.so.6!_int_realloc(mstate av,mchunkptr oldp,size_t oldsize,size_t nb) (/build/glibc-YYA7BZ/glibc-2.31/malloc/malloc.c:4564)
libc.so.6!__GI___libc_realloc(size_t bytes,void * oldmem) (/build/glibc-YYA7BZ/glibc-2.31/malloc/malloc.c:3226)
libc.so.6!realloc_hook_ini(void * ptr,size_t sz,const void * caller) (/build/glibc-YYA7BZ/glibc-2.31/malloc/hooks.c:41)
readItem(struct item * pProduct) (/home/max/My stuff/programming/Udemy/section 14,reading and wrinting files/test.c:22)
main() (/home/max/My stuff/programming/Udemy/section 14,reading and wrinting files/test.c:72)
解决方法
建议;
分配一个长缓冲区,比可能需要的更长。然后通过调用fgets()
char buffer[1024];
fgets( buffer,sizof( buffer ),stdin );
-或-
使用getline()
函数读取数据
char *buffer = NULL;
size_t byteCount;
getline( &line,&byteCount,stdin );
注意:为了使图示简单,我没有进行上面的错误检查。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。