【问题标题】:c: implementation of a rownames functionc: rownames 函数的实现
【发布时间】:2012-04-29 03:50:33
【问题描述】:

我有一个二维指针数组(指向字符串)

 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 并且不得不分配我自己的内存。

【问题讨论】:

  • rownames 是指向指针的指针,所以 char **names = getRownames(7000,14,result);可能工作
  • 还需要修复返回语句和函数签名
  • 不应该是rownames[i] = malloc...吗?

标签: c multidimensional-array strcpy slice


【解决方案1】:

这里有几个问题

  • 您的返回语句是错误的(它应该只是行名,而不是*行名)。反正我不会那样做的。
  • 我没有看到您的其余代码,但如果您不初始化 *result[][0],您很可能会在 strlen 调用中出现段错误。
  • 我会避免尝试返回指向该大小堆栈上的数组的指针(不要返回指向尚未进行 malloc'd 的局部变量的指针),因此我将传入数组并让函数填充给你。如果你有一个 malloc 指向该数据大小的指针,即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]);
}

【讨论】:

    【解决方案2】:

    这里发生了一些事情。

    函数声明/原型的数组和矩阵需要有固定的大小。*

    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]);
         }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-04
      • 1970-01-01
      • 1970-01-01
      • 2011-09-02
      相关资源
      最近更新 更多