调用malloc()会导致无法解释的程序崩溃

时间:2015-05-12 14:12:32

标签: c string

我遇到一个问题,即我对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()来电,但由于某种原因,第二次失败,而第一次总是成功。

2 个答案:

答案 0 :(得分:3)

第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 overrun,反过来调用undefined behaviour

注意:

  1. malloc() Csizeof(char)家人的回复价值do not cast
  2. 1保证在C aisle,你可以摆脱它。
  3. 第3点

    根据您的代码,char aisle[1]; 定义为

    aisle[0] = input[i];
    aisle[1] = '\0';
    

    然而,稍后,您使用了

    aisle

    这又是内存溢出和UB。将您char aisle[2] = {0}; 更改为

    document.getElementById('MyForm').onchange = function (event) {
        event.preventDefault();
        switch (myColor) { 
            case '/':
                if (input.value ? '#' + input.value : '#333') {
                    result = input.value;
                } 
                else {
                    result = 'Six numbers or letters!';
                }
                break;
    
        }
        document.getElementsByName('result')[0].innerHTML = result;
    };
    

答案 1 :(得分:0)

SEQUENCE : 
...
   SET : 
      SEQUENCE : 
         OBJECT_IDENTIFIER : 'G (2.5.4.42)'
         TeletexString : 'YYY'
      SEQUENCE : 
         OBJECT_IDENTIFIER : 'SN (2.5.4.4)'
         TeletexString : 'XXX'
      SEQUENCE : 
         OBJECT_IDENTIFIER : 'CN (2.5.4.3)'
         PrintableString : '0000'

上面的行应该是

name[count+1] = '\0';

您的代码将导致写入1个未由您分配的额外内存位置。

这些线路也存在问题......

name[count] = '\0'; //one item less