我是一个相当新的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) ...
答案 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] )
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);