函数内的字符串指针分配 - Segmentaion故障

时间:2017-01-17 12:26:59

标签: c pointers

我正在尝试将内存分配给函数内的char指针。但是我在for cycle at i=1中的函数内部出现了分段错误。对于i=0,它分配内存。我正在努力解决这个问题。也许其他“眼睛”可以看出出了什么问题。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<malloc.h>

void AllocateDeallocate(int, int, int, char***);

int main(void)
{
    char** header1;
    char** header2;
    AllocateDeallocate(1,3,40,&header1);

    return 0;
}

void AllocateDeallocate(int iopt, int nStr, int StrLen, char*** Str)
{
    int i;
    switch (iopt)
    {
    case 1:
        if (NULL == Str)
        {           
            exit(EXIT_FAILURE);
        }
        if(*Str == NULL)
        {
            *Str = (char**)malloc(sizeof(char*)*nStr);          
            if (*Str== NULL)
            {
                puts("Memory allocation failed.");
                exit(EXIT_FAILURE);
            }       
        }
        for(i = 0 ; i< nStr;i++)
        {   
            printf("String %d allocation\n",i); 
            *Str[i] = (char*)malloc(sizeof(char)*(StrLen+1));
            if (*Str[i] == NULL)
            {
                puts("Memory allocation failed.");
                exit(EXIT_FAILURE);
            }
        }
        break;
    case 2:
        for( i = 0; i<nStr; i++)
        {
            free(*Str[i]);
        }
        free(*Str);
        break;
    default:
        printf("Wrong Option");
    }
}   

1 个答案:

答案 0 :(得分:3)

当您调用函数AllocateDeallocate时,变量header1未初始化。这意味着函数*Str内部存在不确定值(并且看似随机)。

然后使用*Str(例如在*Str == NULL中)会导致问题(因为该值很可能 等于NULL

简单的解决方案?初始化main函数中的变量:

char** header1 = NULL;
char** header2 = NULL;

一旦你解决了上述问题,你就会有其他问题。就像你做*Str[i]时一样。由于operator precedence规则,它等于*(Str[i]),而不是您想要的。您需要明确使用括号来(*Str)[i]

上述两个问题都会导致未定义的行为,并可能导致崩溃。