用C语言将静态二维阵列转换为动态阵列



我们被要求将2D静态数组转换为动态数组。因此,我需要创建一个指针数组,其中每个指针指向不同的行。我已经写了这段代码,但当我在*(dynamicStr[i] + v) = rowStr[v];行I=1时,我的代码会中断。此外,如果我启用free(ptr);部分,我的调试器会在那里停留6或7次,然后继续。

编辑:最后,我用@dodooft和@Viktor Terziev给出的答案解决了这个问题。

#include <stdio.h>
#include <stdlib.h>
void toDynamic(int x,int y, char toDyna[x][y]);
void toDynamic2(int x,int y, char toDyna[x][y]);
int main()
{
char toDyna[7][12] = {
"JOHN",
"MARK",
"PIERCEPIERCE",
"20",
"ROSIE",
"ALEX",
"MARLYN"
};
int x = 7;
int y = 12;
toDynamic2(x, y, toDyna);
return 0;
}
void toDynamic2(int x,int y, char toDyna[x][y]){
char *dynamicStr[x];
int rowToCheck = 0;
int size;
char *ptr;
int c;
for(int i = 0; i < x; i++){
printf("i: %dn",i);
c = 0;
size = strlen(toDyna[rowToCheck]);
ptr = (char*) malloc(size * sizeof(char));
for(int j = 0; j < y; j++){
if(toDyna[i][j] != ''){
*(ptr+c) = toDyna[i][j];
c++;
} else{
break;
}
}
*(ptr+size) = '';
printf(" ");
char rowStr[size];
for(int v = 0; v < size; v++){
rowStr[v] = *(ptr+v);
printf("Added Char: %cn", rowStr[v]);
*(dynamicStr[i] + v) = rowStr[v];
}
//free(ptr);
//printf("n%sn", rowStr);
//dynamicStr[i] = &rowStr;
rowToCheck++;
}
for(int i = 0; i < x; i++){
printf("%sn", dynamicStr[i]);
}
}

编辑:这是代码的工作版本:

#include <stdio.h>
#include <stdlib.h>
char** toDynamic(int x,int y, char toDyna[x][y]);
void free2DArray(int x, char **dynamicStr);
int main()
{
char toDyna[7][12] = {
"JOHN",
"MARK",
"PIERCEPIERCE",
"20",
"ROSIE",
"ALEX",
"MARLYN"
};
int x = 7;
int y = 12;
char **dynamicArr;
dynamicArr = toDynamic(x, y, toDyna);
free2DArray(x, dynamicArr);
return 0;
}
char** toDynamic(int x,int y, char toDyna[x][y]){
printf("Q2n");
char **dynamicStr;
int rowToCheck = 0;
int size;
int c;
dynamicStr = (char*)malloc(x * sizeof(char*));
for(int i = 0; i < x; i++){
dynamicStr[i]  =  (char*)malloc(y * sizeof(char));
c = 0;
size = strlen(toDyna[rowToCheck]);
char *ptr = (char*) malloc((size + 1) * sizeof(char));
for(int j = 0; j < y; j++){
if(toDyna[i][j] != ''){
*(ptr+c) = toDyna[i][j];
c++;
} else{
break;
}
}
*(ptr+size) = '';
dynamicStr[i] = ptr;
rowToCheck++;
}
for(int i = 0; i < x; i++){
printf("%sn", dynamicStr[i]);
}
printf("----------------------------n");
return dynamicStr;
}
void free2DArray(int x, char **dynamicStr){
printf("Q3n");
for(int i = 0; i < x; i++){
free(dynamicStr[i]);
printf("dynamicStr %d freedn", i);
}
free(dynamicStr);
printf("dynamicStr array freedn");
printf("----------------------------n");
}

它比你想象的要容易得多,请参阅strcpy文档和strlen文档,并且(如果你使用我的代码(不要忘记释放内存。

char * * toDynamic2(size_t n, size_t m, char strings[n][m])
{
char * * arr = malloc(n * sizeof(char*));
for(size_t i = 0; i < n; ++i)
{
size_t size = strlen(strings[i]);
arr[i] = malloc((size + 1) * sizeof(char));
strcpy(arr[i], strings[i]);
}
for(size_t i = 0; i < n; ++i)
{
printf("%sn", arr[i]);
}
return arr;
}

您将dynamicStr定义为一个字符指针数组,当您尝试用*(dynamicStr[i] + v) = rowStr[v];为其赋值时,基本上是将rowStr[v]的值复制到dynamicStr[i] + v所指向的地址。该地址没有在您的代码中定义,所以您得到了一个segfault。

如果您试图用指向具有动态内存的新数组的指针来填充dynamicStr,则应该尝试类似的方法

dynamicStr[i] = ptr;

其中ptr是malloc调用返回到第i行的指针。此外,在处理字符串时,可以使用strcpy将数据从静态数组复制到动态数组。

最新更新