我遇到了一个问题,我打给malloc()
的电话导致我的程序崩溃。代码如下:
void update_item(char *input, item_t *new_node){
int i, count, shelf, weight, price, quantity;
char *name;
char *specifier;
char aisle[1];
count = 0;
/*Find name of the new item and assign to the name field of new_node...*/
for (i = 0; input[i] != ','; i++){
count++;
}
name = (char*)malloc((count+1)*sizeof(char));
if (name == NULL){
printf("Out of memory. Shutting down.\n");
exit(EXIT_FAILURE);
}
for (i = 0; input[i] != ','; i++){
name[i] = input[i];
}
name[count+1] = '\0';
new_node->name = name;
printf("%s\n", new_node->name);
/*Find aisle specifier and assign it to aisle field of new_node...*/
i++;
aisle[0] = input[i];
aisle[1] = '\0';
new_node->aisle = aisle;
printf("%s\n", new_node->aisle);
for(i = i+2, count = 0; input[i] != ','; i++){
count++;
}
specifier = (char*)malloc(count*sizeof(char)); /*PROGRAM CRASHES HERE*/
if (specifier == NULL){
printf("Out of memory. Shutting down.\n");
exit(EXIT_FAILURE);
}
printf("boom\n");
我完全被难住了。对
malloc()
有两个相同的调用,但是由于某些原因,第二个每次都失败,而第一个总是成功的。 最佳答案
第1点
for (i = 0; input[i] != ','; i++){
是不安全的。如果您的
input
不包含,
,则会导致内存溢出。相反,使用类似于 int len = strlen(input);
for (i = 0; (input[i] != ',') && len ; i++, len--){
第2点
在
C
中,我们有基于0
的索引。所以,对于这样的分配,name = malloc(count+1);
以后,做
name[count+1] = '\0';
又是meory overflow,它反过来调用undefined behaviour。
注:
请do not cast返回值
malloc()
和C
中的族。sizeof(char)
在1
中被保证为C
,您可以去掉它。第3点
根据您的代码,
aisle
定义为char aisle[1];
但是,后来你用
aisle[0] = input[i];
aisle[1] = '\0';
又是内存溢出和UB。将您更改为
char aisle[2] = {0};
关于c - 调用malloc()导致程序崩溃,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30193469/