使用指针操作函数外部的数组?

时间:2016-10-28 11:40:53

标签: c arrays

保持谨慎我在这里完成这个代码以简化我的问题,如果有任何问题,请不要轻易误会,我的问题是通过使用它的指针来操纵一个功能以外的阵列。< / 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]);
}

那我在这里做错了什么?我认为传递给函数时的数组会衰减成指向第一个元素的指针(因此也就是该数组),但事实并非如此。我究竟做错了什么?如何通过传递函数指针来操作函数外的数组?

谢谢!

2 个答案:

答案 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]声明为可变长度数组(即arraysize1直到运行时才知道。如果是这种情况,那么您的函数定义需要看起来像

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

<小时/>

  1. 除非它是somefunction( a, size2, array, size1 ); 或一元sizeof运算符的操作数,或者是用于在声明中初始化字符数组的字符串文字,表达式为类型“{元素数组&”将被转换(“衰减”)为“指向T的指针”类型的表达式,表达式的值将是第一个元素的地址数组。在您的情况下,N为Tsize1为“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);
    }
}