我遇到了一个问题,我打给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/

10-16 20:27