繁体   English   中英

函数中的字符指针分配-Segmentaion错误

[英]Char Pointer allocation within a function - Segmentaion fault

我试图将内存分配给函数内的char指针。 但是for cycle at i=1for 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");
    }
}   

当您调用函数AllocateDeallocate ,变量header1尚未初始化。 这意味着函数*Str内有一个不确定的值(并且似乎是随机的)。

然后,当您使用*Str (例如,在*Str == NULL )时,将导致出现问题(因为该值很可能等于NULL )。

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

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

解决上述问题后,您还会遇到其他问题。 就像您做*Str[i] 由于运算符优先级规则,它等于*(Str[i]) ,这不是您想要的。 您需要显式使用括号来具有(*Str)[i]


以上两个问题都将导致不确定的行为,并且很可能导致崩溃。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM