【问题标题】:How to edit an array in another function than the main function in c programming?如何在 C 编程中的 main 函数之外的另一个函数中编辑数组?
【发布时间】:2021-07-15 00:06:52
【问题描述】:

我想在另一个函数中将数组中的每个元素比主函数增加一个。然后,我想调用这个函数并在主函数中打印。

#include <stdio.h>

int function(int array2[5]) {

    int i;
    while(i<4) {
        array2[i]=array2[i]+1;
        i++;
    }

    return array2[5];
}

int main() {
int array[5]={1,2,3,4,5};
int answer;

answer[5]=function(array[5]);

int j;
while(j<4) {
    printf("%d \n",answer[j]);
    j++;
}

return 0;
}

【问题讨论】:

  • 在声明数组时[5] 给出了大小,但之后它访问数组中的第 6 个元素。而且 answer 根本不是一个数组
  • 请告诉您您认为这意味着什么和做了什么以及您的编译器警告或错误(尤其是严格警告):answer[5]=function(array[5]);。为此,您必须编译您在此处显示的代码,我怀疑这是您在家中拥有的代码。 IE。请确保您确实提供了minimal reproducible example

标签: arrays c increment function-definition


【解决方案1】:

需要了解的一些重要事项:

  • 在 C 中传递数组时,不会进行复制。是同一个数组,所以修改传入的数组就是修改原来的。
  • [] 是运算符,不是变量名的一部分。
  • [] 在声明类型时的工作方式与在表达式中使用时不同。 array[5] 为您提供 array 中的第 6 个元素,但 int array[5] 声明了一个包含 5 个元素的数组。
  • 访问超出分配数组末尾的元素具有未定义的行为,但通常会崩溃。
  • 如果你声明一个变量int answer 它不是一个数组,也不能成为一个数组。只是一个int
  • 如果要复制数组,则需要显式复制。有一些标准库可以做到这一点,但您应该学会将每个元素一个一个地复制到新数组中。

【讨论】:

    【解决方案2】:

    函数的返回类型int没有意义。

    int function(int array2[5]) {
    

    此外,您还试图返回仅包含 5 个元素的数组中不存在的第 6 个元素。

    return array2[5];
    

    在函数中你使用的是未初始化的变量i

    int function(int array2[5]) {
    
        int i;
        while(i<4) {
        //...
    

    导致未定义的行为。此外,使用的幻数 4 没有任何意义,至少因为您正试图将带有 5 元素的数组传递给函数。

    该函数应使用第二个参数声明,该参数指定传递数组中元素的数量。这个函数声明

    int function(int array2[5]);
    

    并不意味着传递给函数数组的完全有5 元素。编译器会将函数的参数声明调整为指向数组元素类型的指针,如

    int function(int *array2);
    

    在main中的这个语句中

    int answer;
    
    answer[5]=function(array[5]);
    

    您正在使用带有标量类型int 的对象的下标运算符。所以编译器会发出错误信息。

    这是一个演示程序,展示了如何定义函数。

    #include <stdio.h>
    
    void function( int a[], size_t n ) 
    {
        for ( ; n--; ++a )
        {
            ++*a;
        }
    }
    
    int main(void) 
    {
        int a[] = { 1, 2, 3, 4, 5 };
        const size_t N = sizeof( a ) / sizeof( *a );
        
        for ( size_t i = 0; i < N; i++ )
        {
            printf( "%d ", a[i] );
        }
        
        putchar( '\n' );
        
        function( a, N );
        
        for ( size_t i = 0; i < N; i++ )
        {
            printf( "%d ", a[i] );
        }
        
        putchar( '\n' );
        
        return 0;
    }
    

    程序输出是

    1 2 3 4 5 
    2 3 4 5 6 
    

    【讨论】:

      【解决方案3】:

      给你。我想这就是你想要的:

      #include <stdio.h>
      
      // Since the array named parameters are scoped only within its function,
      // they are apart from your array in the main.
      void function(int array[], int len) {
          
          int i = 0;
          while(i<len) {
              array[i]=array[i]+1;
              i++;
          }
      }
      
      // Or alternatively you can process the array using a pointer
      void functionWithPointer(int *array, int len) {
          
          int i = 0;
          while(i<len) {
              *(array+i) = *(array+i)+1;
              i++;
          }
      }
      
      int main() {
          int array[]={1,2,3,4,5};
      //  int answer; // Not necessary
          int length = sizeof(array) / sizeof(int); // !!!ATTENTION
          
          function(array, length);
          
          // The array values updated by 1
          printf("Array values after 1st update\n");
          for(int k=0; k<length; k++) {
              printf("%d \n",array[k]);
          }
          
          functionWithPointer(array, length);
          
          // The array values updated by 1 again
          printf("Array values after 2nd update\n");
          int j;
          while(j<length) {
              printf("%d \n",array[j]);
              j++;
          }
          
          return 0;
      }
      

      这是输出:

      Array values after 1st update
      2 
      3 
      4 
      5 
      6 
      Array values after 2nd update
      3 
      4 
      5 
      6 
      7 
      

      【讨论】:

        猜你喜欢
        • 2020-07-09
        • 1970-01-01
        • 1970-01-01
        • 2021-08-19
        • 2015-05-12
        • 1970-01-01
        • 2015-01-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多