在mallocing中发生Seg Fault

时间:2016-05-21 15:57:21

标签: c arrays string segmentation-fault malloc

此功能是程序的一部分,它将获得有关书籍的统计数据(特定字母,单词等的数量)。事情是尝试malloc时出现分段错误:

*wordArray[arrayIndex] = malloc(sizeof(***wordArray)*(wcslen(newWord)+1));

重新分配整个数组后

*wordArray = realloc(*wordArray, (arrayIndex+1)*sizeof(**wordArray));

我知道realloc并不是真的很有效,但目前最重要的是理解为什么它根本不起作用。非常感谢。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <locale.h>
#include <wctype.h>
#include <wchar.h>

#define X 2

void wordManager(wchar_t ***, int **, wchar_t *);
int main(int argc, char **argv){
    setlocale(LC_ALL, "");

    wchar_t **wordArray;
    int *wordAmount;
    wchar_t word[50];

    for(int i=0; i<X; i++){
        scanf("%ls", word);
        wordManager(&wordArray, &wordAmount, word);
    }

    for(int i=0; i<X; i++){
        printf("%ls; %d times\n", wordArray[i], wordAmount[i]);
    }
}

void wordManager(wchar_t ***wordArray, int **wordAmount, wchar_t *newWord){
    static int isArrayInitialised = 0;
    static int isArrayEmpty = 1;
    static int arrayIndex = 0;
    int wordLocation;

    if(!isArrayInitialised){
        *wordArray = malloc(sizeof(**wordArray)*1);
        if(*wordArray==NULL){
            printf("Error mallocing wordArray");
            exit(EXIT_FAILURE);
        }
        *wordAmount = calloc(1, sizeof(*wordAmount));
        if(*wordAmount==NULL){
            printf("Error callocing wordAmount");
            exit(EXIT_FAILURE);
        }
        isArrayInitialised = 1;
    }
    if(isArrayEmpty){
        *wordArray[0] = malloc(sizeof(***wordArray)*(wcslen(newWord)+1));
        wcscpy(*wordArray[0], newWord);
        *wordAmount[0] = 1;
        isArrayEmpty = 0;
    }
    else{
        //Check if word is already in an array.
        wordLocation = 0;
        for(; wordLocation<arrayIndex+1; wordLocation++){
            if(!wcscmp(*wordArray[wordLocation], newWord))  break;
        }
        printf("%d\n", wordLocation);
        //Word hasn't been found. Then:
        if(wordLocation==arrayIndex+1){
            arrayIndex++; //Increase arrays' volume.
            *wordArray = realloc(*wordArray, (arrayIndex+1)*sizeof(**wordArray));
            if(*wordArray==NULL){
                printf("Error reallocating wordArray memory.\n Array index: %d", arrayIndex);
                exit(EXIT_FAILURE);
            }
            *wordAmount = realloc(*wordAmount, (arrayIndex+1)*sizeof(**wordAmount));
            if(*wordAmount==NULL){
                printf("Error reallocating wordAmount memory.\n Array index: %d", arrayIndex);
                exit(EXIT_FAILURE);
            }

            *wordArray[arrayIndex] = malloc(sizeof(***wordArray)*(wcslen(newWord)+1));
            wcscpy(*wordArray[arrayIndex], newWord);
            *wordAmount[arrayIndex] = 1;
        }
        //Word has been found in an array.
        else{
            (*wordAmount[wordLocation])++;
        }
    }
}

0 个答案:

没有答案