2012-04-17 79 views
0

我有指针的二维数组(字符串)开始C:实施rownames的功能

char *result[7000][14]; 

我想写返回第一个字符串中的每个“行”的功能。

这里是我的尝试:

char *getRownames (int a, int b, char *matrix[a][b]) 
{ 
    char *rownames[a]; 
    for(int i=0;i<a;i++){ 
     rownames[i] = malloc(strlen(matrix[i][0])+1); 
     strcpy(rownames[i],matrix[i][0]); 
    } 

    return *rownames; 
} 

然后

char *names = getRownames(7000, 14, result); 

我得到,说冲突的类型getRowNames错误。仍然习惯于C并且不得不分配我自己的记忆。

+0

rownames是一个指针指针,所以char ** names = getRownames(7000,14,result);可能工作 – Chris 2012-04-17 19:26:00

+0

需要修复return语句和函数签名, – Mat 2012-04-17 19:27:08

+0

不应该是'rownames [i] = malloc ...'吗? – 2012-04-17 19:29:03

回答

0

你有几件事会在这里。

函数声明/原型需要有固定尺寸的阵列&矩阵。*

char *getRownames (int a, int b, char *matrix[a][b])

将不能工作,因为编译器不知道ab编译程序时。如果你知道数组将是它的大小将需要

char *getRownames (int a, int b, char *matrix[7000][14])

。那么你根本不需要ab。如果您希望能够将不同大小的矩阵传递给函数,那完全是另一回事。

*(请注意,编译器允许你离开了数组的第一个维度:char *matrix[][14]char *array[]

接下来,你需要通过malloc将返回值转换为char *,为的malloc()返回void *:

rownames[a] = (char*)malloc(strlen(matrix[i][0])+1);

顺便说一句,它应该是在循环rownames[i]。 :-)由于i是你的循环变量。

最后,它看起来像你想返回一个char *数组,但是return *rownames将只返回数组中的第一个值。同样,如果你知道数组的大小,将现有的数组传递给函数并使其填入数值会更容易。否则,你必须malloc数组返回。

char *result[7000][14]; 
char *firstRows[7000]; 
//... other code that fills in these values 
getRownames(7000, 14, result, firstRows); 

void getRownames (int a, int b, char* matrix[7000][14], char* returnrows[7000]) 
{ 
    for(int i=0;i<a;i++){ 
     returnrows[i] = (char*)malloc(strlen(matrix[i][0])+1); 
     strcpy(returnrows[i],matrix[i][0]); 
    } 
} 
1

有几个问题在这里

  • 你的回报说法是错误的(这应该只是rownames,不* rownames)。无论如何,我不会这样做。
  • 我没有看到你的代码的其余部分,但是如果你没有初始化*result[][0],你很可能会在strlen调用上发生段错误。
  • 我会避免试图返回一个指向该大小的堆栈上的数组的指针(不要返回指向未被malloc'd的局部变量的指针),所以我会传入数组并将函数fill它适合你。如果你有一个指向这个数据大小的指针,例如char *rownames=malloc(a*sizeof(char *));,你会没事的。

所以我做了这个与我的测试代码:

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

void getRownames (int a, int b, char *matrix[a][b], char* rownames[a]) 
{ 
    int i; 
    for(i=0;i<a;i++){ 
     //printf("%d\n",strlen(matrix[i][0])); 
     rownames[i] = malloc(strlen(matrix[i][0])+1); 
     strcpy(rownames[i],matrix[i][0]); 
    } 
    //strlen(matrix[i][0]) 
    //return &rownames[0]; 
} 

int main(void) { 
    char *result [700][14]; 
    int i=0; 
    for(i=0;i<700;i++){ 
    result[i][0]="abcd0"; 
    } 
    char *rownames[700]; 
    getRownames(700,14,result,rownames); 
    printf("I finished"); 
    printf("%s",rownames[0]); 
    printf("%s",rownames[1]); 
    printf("%s",rownames[2]); 
    printf("%s",rownames[3]); 
}