C 程序在试图运行代码的特定部分时崩溃

C 程序在试图运行代码的特定部分时崩溃,c,C,我的代码是这样的: #include <stdio.h> #include <stdlib.h> #include <math.h> char ** djiksin(char ** inp){ } int evaluation(char ** rpn){ } void printarr(char arr[]){ int i=0; while(arr[i] != '\0'){ printf("%c",arr[i]);

我的代码是这样的:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

char ** djiksin(char ** inp){

}
int evaluation(char ** rpn){

}
void printarr(char arr[]){
    int i=0;
    while(arr[i] != '\0'){
        printf("%c",arr[i]);
        ++i;
    }
}
int main(){
    int i = 0,k = 0,j=0;
    char a[201] = {'\0'};
    char ** strinp;
    fgets(a,201,stdin);
    while(a[i] != '\0'){
        if(a[i] == '(' || a[i] == ')' || a[i] == '*'|| a[i] == '+'|| a[i] == '^'|| a[i] == '~'|| a[i] == '/'|| a[i] == '-'){
            j = 0;
            k = k+1;
            strinp[k][j] = a[i];
            k = k + 1;
        }else if(a[i] == ' '){
            k = k + 1;
            j = 0;
        }else{
            strinp[k][j] = a[i];
            j = j+1;
        }
        ++i;
    }
    printarr(a);
    return 0;
 }
#包括
#包括
#包括
字符**djiksin(字符**inp){
}
整数求值(字符**rpn){
}
无效打印阵列(字符阵列[]){
int i=0;
而(arr[i]!='\0'){
printf(“%c”,arr[i]);
++一,;
}
}
int main(){
int i=0,k=0,j=0;
字符a[201]={'\0'};
字符**strinp;
fgets(a,201,stdin);
而(a[i]!='\0'){
如果(a[i]='('| a[i]=')'| a[i]='*'| a[i]='+'| a[i]='^'| | a[i]='~'| a[i]='/'| a[i]='-'){
j=0;
k=k+1;
strinp[k][j]=a[i];
k=k+1;
}else如果(a[i]=''){
k=k+1;
j=0;
}否则{
strinp[k][j]=a[i];
j=j+1;
}
++一,;
}
printarr(a);
返回0;
}
到目前为止,本规范的目的是采用数学公式并将其格式化,以供调车场算法使用。在我看来,这是试图让每个运算符和操作数在单独的字符串中。 最后,strinp应该给出一个字符串数组,我可以在前面声明的函数中使用它

但每次我尝试编译并运行程序进行测试时,在我输入窗口后,都会出现错误“程序停止工作”。关闭错误后,它在命令提示符下输出:
进程在3.871秒后退出,返回值为322225477

当我对
main
中的
while
部分进行注释时,只要输出正确,代码就可以正常工作

有什么想法吗

char ** strinp;
...
strinp[k][j] = a[i];

strinp
是未初始化的指针。您没有为它分配任何内存,也没有将它指向有用的内存。取消引用无效指针是崩溃的原因。

您没有为strinp变量分配内存

char ** strinp = (char **)malloc(sizeof(char*) * 20);

for(int i = 0; i < 20; i++)
{
    strinp[i] = (char *)malloc(sizeof(char) * 20);
}
char**strinp=(char**)malloc(sizeof(char*)*20);
对于(int i=0;i<20;i++)
{
strinp[i]=(char*)malloc(sizeof(char)*20);
}

你需要的是这样的东西。当然,您需要根据您的需要更改分配大小。

正如其他人所说,在尝试为srtinp pionter赋值之前,您必须分配内存

/*

compile ::: $ gcc test.c -o test

run :::    $ ./test

*/

#include <stdio.h>
#include <stdlib.h>
#include <math.h>


void
printarr(char arr[])
{ 
    int i=0;
    while(arr[i] != '\0'){
        printf("%c",arr[i]);
        ++i;
    }
}


int 
main(int argc, char **argv)
{
    int i = 0,k = 0,j=0;
    char a[201] = {'\0'};
    char ** strinp;

    printf("Enter a string\n");
    fgets(a,201,stdin);///get input from user


/// obtain length of input 
    int x=-1;
    for (x=0 ; a[x]!='\0' && x<=200;x++){
            ;
    }
    x--;

    printf("lenght of a: %d\n",x);///len a is x



/// allocate sufficient amount of Memory
strinp = malloc(sizeof(char*) * x);
for(int i=0;i<x; i++) 
  strinp[i] = malloc(sizeof(char)*x);  




//~ i=0;
//~ j=0;
//~ k=0;

    /// do this 
    ///seem to erase space from input
    while(a[i+1] != '\0'){
        //printf("in while1\n");
        if(a[i] == '(' || a[i] == ')' || a[i] == '*'|| a[i] == '+'|| a[i] == '^'|| a[i] == '~'|| a[i] == '/'|| a[i] == '-'){
            j = 0;
            k = k+1;
            //printf("in while2\n");
            strinp[k][j] = a[i];
            //printf("%c,%c\n",a[i],strinp[k][j]);
            k = k + 1;
            //printf("%c\n",a[i]);
        }else if(a[i] == ' '){
            k = k + 1;
            j = 0;
           // printf("%c\n",a[i]);
        }else{///if alphabet or number
            //printf("in while 3\n");
            strinp[k][j] = a[i];
            //printf("%c,%c\n",a[i],strinp[k][j]);
            j = j+1;
        }
        ++i;
    }

    printf("array:");
    printarr(a);///print array of a[]
    //printf("end\n");

    ///print strinp 
    printf("pointer:");
    for(int i=0;i<x;i++)
     for(int j=0;j<x;j++)
        printf("%c",strinp[i][j]);

    printf("\n");       

    ///free aloocated memory
    for(i=0;i<x; i++) 
        free(strinp[i]);
    free(strinp);

    return 0;

}
/*
编译:$gcc test.c-o测试
运行::$/测试
*/
#包括
#包括
#包括
无效的
printarr(char-arr[]
{ 
int i=0;
而(arr[i]!='\0'){
printf(“%c”,arr[i]);
++一,;
}
}
int
主(内部argc,字符**argv)
{
int i=0,k=0,j=0;
字符a[201]={'\0'};
字符**strinp;
printf(“输入字符串”);
fgets(a,201,stdin);///从用户处获取输入
///获取输入的长度
int x=-1;

对于(x=0;a[x]!='\0'&&x,最简单的解决方案是将striinp制作成一个二维数组。类似于strinp[100][201]。