C:全局定义多维char数组

时间:2013-05-02 20:37:35

标签: c arrays char global multidimensional-array

我要做的是:读取定义最大值的x字符串s_1 ... s_x。长度l = 1000000并存储它们。变量x作为输入给出,表示应该是全局定义的。

我想怎么做:

  1. 全局定义指向char:

    的指针
    char** S;
    
  2. 在本地,从输入读取x后,为x指针分配空间:

    S = (char**) malloc(sizeof(char*)*x);
    
  3. 在本地为每个字符串s_i分配空间并将字符串读入已分配的空间:

    while(i<x){
        S[i] = (char*) malloc(sizeof(char)*1000000);
        scanf("%s",S[i]);
        i++;
    }
    
  4. 当我尝试访问

        S[0][0]
    

    它给出了内存访问错误。有任何想法吗?谢谢!


    编辑:

    我打印了数组并且工作正常,所以问题确实存在于访问代码中。这是:任何人都可以看到问题是什么?因为我不能......

        makeBinary(){
    
            printf("inside makeBinary()\n");
    
            S_b = malloc(sizeof(int)*1000000*x);
            length = malloc(sizeof(int)*x);
            int i;
            int j;
            for(i=0;i<x;i++){
                for(j=0;j<1000000;j++){ printf("1\n");  
                    if(S[i][j]=='\0'){  printf("2\n");
                        length[i] = j; 
                            break;                  
                    }else{  
                        S_b[i][j] = S[i][j]-96;     printf("3\n");      
                    }   
                }
            }       
        }
    

    打印'1'然后崩溃。我知道代码远非最优,但是现在我想首先解决问题。谢谢!

2 个答案:

答案 0 :(得分:0)

有很多事情发生:
改变了奇怪的铸造malloc的东西,但有点icky 你也不应该使用sprintf复制内存...... 我不会总是分配最大值 你可以分配正确的金额,strlen()+1 ...确保0填补结尾......如:

int t = 100;
char * buffer = malloc(sizeof(char*)*t);
S = &buffer;

for( int i = 0; i<10 ; i++){
    char * somestring = __FILE__;
    size_t len = strlen(somestring);
    S[i] = (char*) malloc(len+1);
    S[i][len] = 0;
    memcpy(S[i], somestring,len);
}

答案 1 :(得分:0)

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

char** S;

int main(void){
    int i = 0, x = 100;
    S = (char**) malloc(sizeof(char*) * x);//t --> x

    while(i<x){
        S[i] = (char*) malloc(sizeof(char)*1000000);
        if(S[i]==NULL){// check return of malloc
            perror("memory insufficient");
            return -1;
        }
        scanf("%s",S[i]);
        i++;
    }
    printf("%s\n", S[0]);//fine
    printf("%c\n", S[0][0]);//fine
    return 0;
}