C二维阵列分割故障

时间:2015-02-17 05:43:19

标签: c arrays

我正在编写一个程序,在我的程序中,我需要将第一个1D数组中的信息复制到2D数组中,但每次在1d数组中都有一个\ n时,它会进入2D数组中的不同插槽。例如,如果是1D数组 你好\ nWorld 在2d数组中它将成为 你好/ n在第一个插槽和 世界在第二个位置。

这是我的代码但我得到分段错误。在此步骤之前,已经在我的程序中创建了名为chars的数组。

words = (char**) malloc(numWords*sizeof(char));
  int copyCountForChars=0;
  int copyCountForWords=0;


  while(copyCountForWords <= numWords)
    {

      words[copyCountForWords][copyCountForChars] = chars[copyCountForChars];
      // printf("%c",chars[copyCountForChars]);                                                    
      if(chars[copyCountForChars] == '\n')
        {
          //  printf("%c",chars[copyCountForChars]);                                               

          copyCountForWords++;

        }

      copyCountForChars++;
    }

3 个答案:

答案 0 :(得分:2)

2D阵列的内存分配应该像这样完成。

words = malloc(sizeof(char *) * size1);
for(i = 0; i< size1; i++)
{
    words[i] = malloc(sizeof(char) * size2);
}

答案 1 :(得分:0)

WhozCraig是对的。你的malloc for words并没有分配足够的内存,并且可能导致访问边界外的内存崩溃。这就是为什么: 比较numWords = 2,然后是以下行:

  

words =(char **)malloc(numWords * sizeof(char));

实际上是malloc(2 * 1)。 sizeof(char)是1。

您只分配了2个字节的内存。

在分配方面你的意思是sizeof(chars)吗?这会给你一维数组的大小。即便如此,您仍然需要一次将每个字节从一个数组复制到另一个数组,这是当前没有完成的。

答案 2 :(得分:0)

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

int main(){
    char str[100] = "hello\nworld\nstack\noverflow";

    int numWords = 4; // you can handle this part
    char **words = malloc(numWords * sizeof(char *));

    char *tok = strtok(str, "\n");
    int counter = 0;
    while(tok != NULL){
        words[counter] = tok;
        counter++;
        tok = strtok(NULL, "\n");
    }

    printf("%s\n", words[0]); // hello
    printf("%s\n", words[1]); // world
    printf("%s\n", words[2]); // stack
    printf("%s\n", words[3]); // overflow

}

我像这样可视化指针关系

diagram


如果想在结尾添加\n字符串,则可以使用此代码段。但是当你在变量中隐藏\n时,我认为这是一个糟糕的编码窗口。

int main(){
    char *str = "stackoverflow";
    int size = strlen(str);
    char str2[size+1];
    strcpy(str2, str);
    strcpy(str2+size, "\n");

    printf("%s", str2);
}