我正在编写一个程序,在我的程序中,我需要将第一个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++;
}
答案 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
}
我像这样可视化指针关系
如果想在结尾添加\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);
}