保持谨慎我在这里完成这个代码以简化我的问题,如果有任何问题,请不要轻易误会,我的问题是通过使用它的指针来操纵一个功能以外的阵列。< / strong>
我创建了一个像这样的静态数组
char *array[size1][size2];
出于我的例子,size1 = 3和size2 = 6。
然后我使用一个函数来传递数组的指针,并为其分配字符串。
int counter = 0;
void somefunction(char *a, char *b, int size1){
while(counter<size1){
//do some stuff to a
strcpy(b+counter, a);
counter++;
printf("Adding %s to pos %i RESULT: %s\n",a,counter,b+counter);
}
}
这很好用且输出正确(在函数中输出数组b时),但它实际上并不影响函数外的数组[]。如果我使用
somefunction(a,array,size1);
输出是正确的,但函数(array [])之外的实际数组将输出乱码随机存储器。
我这样输出:
for(int i=0;i<size1;i++){
printf("%s\n",array[i]);
}
那我在这里做错了什么?我认为传递给函数时的数组会衰减成指向第一个元素的指针(因此也就是该数组),但事实并非如此。我究竟做错了什么?如何通过传递函数指针来操作函数外的数组?
谢谢!
答案 0 :(得分:1)
来自评论:
我想做的是计算字符串的长度(size2)。因此,在这种情况下,所有包含的字符串长度为3,例如“ABC”。大小1只是我需要存储和迭代的大小为3的字符串数量。所以size1 = 6 size2 = 3意味着我希望有6个字符串可以通过有序数组访问,所有这些字符串的长度都是3个字符。一旦我计算了size1和size2(我在创建数组之前这样做),它们确实保持不变。
在这种情况下,您要将array
声明为char
的二维数组:
char array[size1][size2]; // no *
请注意,要存储长度为N
的字符串,您需要一个N
+ 1个元素的数组来计算0终止符。因此,如果您要存储"ABC"
({'A','B','C',0}
)等字符串,则size2
需要为4而不是3。
当您将其传递给somefunction
时,表达式的类型 array
“衰减”为“指向size2
的指针 - {{1}的元素数组“(char
) 1 。根据您的描述,听起来您将char (*)[size2]
声明为可变长度数组(即array
和size1
直到运行时才知道。如果是这种情况,那么您的函数定义需要看起来像
size2
应该被称为
/**
* size2 must be declared in the argument list before char (*b)[size2]
* b may also be declared as char b[][size2]; it means the same thing
*/
void somefunction( char *a, size_t size2, char (*b)[size2], size_t size )
{
...
strcpy( b[counter], a );
...
}
<小时/>
somefunction( a, size2, array, size1 );
或一元sizeof
运算符的操作数,或者是用于在声明中初始化字符数组的字符串文字,表达式为类型“{元素数组&
”将被转换(“衰减”)为“指向T
的指针”类型的表达式,表达式的值将是第一个元素的地址数组。在您的情况下,N为T
,size1
为“T
- 元素数组size2
”。
答案 1 :(得分:0)
我相信你只需要这个:
char *array[SIZE];
某些功能如下所示:
int counter = 0;
void somefunction(char *a, char **b){
while(counter < SIZE){
//do some stuff to a
*(b+counter) = calloc(sizeof(char), strlen(a)+1);
strcpy(*(b+counter), a);
counter++;
printf("Adding %s to pos %i RESULT: %s\n",a,counter,b+counter);
}
}