C - 调用"混合分配"的功能数组

时间:2016-10-08 23:05:01

标签: c arrays string function pointers

我是一个相当新的C编程和stackoverflow社区的新成员,虽然我对tex.stackexchange非常熟悉,而且我有语法问题。

我想知道如何动态分配数组的一个维度,同时静态分配另一个维度。 我可以在this question找到答案。我只需要声明一个指向数组的指针,而不是一个指针数组,正如答案所说的那样。问题是我无法想到如何调用此功能"混合分配"数组(我有没有正确的方法来调用它?)作为参数,因为我的变量声明如下:

char (*strings)[maxlen];

其中maxlen是一个全局变量,用于通知每个字符串的长度。然后我动态分配它,所以我有N个字符串,每个字符串的长度为maxlen

strings = malloc(N*sizeof(char));

所以我想调用这个字符串数组的函数,但是我不能想出一种声明它的方法。我的第一枪就是傻逼试试

void func(char **, int);

然后致电

func(strings,N);

但它不起作用,因为我没有char **参数,但是char (*)[100](我的maxlen是100)。所以我收到以下错误:

expected ‘char **’ but argument is of type ‘char (*)[100]’

当然。

好吧,如果我选择动态分配两个维度,我的问题可能会解决,但这不是我的意图。

我怎么能声明一个函数,我的变量会在没有问题的情况下通过它?

提前致谢。

编辑: maxlen,在编译时已知。

我的最小示例代码(尚未测试):

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

 #define maxlen 100


 void func(char (?), int N);

 int main()
 {

    char (*strings)[maxlen];
    int i, N;

    scanf("%d", &N);
    getchar();
    strings = malloc(N*sizeof(char));
    for(i=0;i<N;i++)
    {
       fgets(strings[i],sizeof(strings[i]),stdin);
    }

    func(strings,N);

    return 0;

 }

 void func(char (?), int N) ...

3 个答案:

答案 0 :(得分:2)

您的问题尚不清楚编译时是否知道maxlen。以下代码适用于这两种情况。如果在编译时知道它,那么您不需要将其作为参数传递给func

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

void func( int n_strings, int maxlen, char (*ps)[maxlen] )
{
    for (int i = 0; i < n_strings; ++i)
        printf("%s\n", ps[i]);
}

int main()
{
// automatic allocation
    char arr[4][7] = { "Red", "Blue", "Green", "Yellow" };
    func(4, 7, arr);

// dynamic allocation
    int maxlen = 7;
    char (*arr2)[maxlen] = calloc(4, maxlen);
    strcpy(arr2[0], "Red");
    strcpy(arr2[1], "Blue");
    strcpy(arr2[2], "Green");
    strcpy(arr2[3], "Yellow");
    func(4, 7, arr2);
}

答案 1 :(得分:0)

您需要更改malloc的参数。

char (*strings)[maxlen];

strings = (char(*)[maxlen])malloc(N*sizeof(char[maxlen]));
在malloc告诉您变量的类型是什么之前

( char(*)[maxlen] )

malloc中的

N*sizeof(char[maxlen]) 因为sizeof(char [maxlen])是一个字符串所需的大小

如何:

定义func void func(char (*string)[maxlen]){.....}

在数组字符串中获取字符串的地址strings+i

访问字符串strings[i]其中0 <= i&lt; Ñ

请记住

&strings[i]strings+i - &gt;相同是字符串的地址

strings[i]*(strings+i) - &gt;相同是一个具体的字符串

答案 2 :(得分:-2)

试试这个:

void func(char * [100],int);