【问题标题】:C - Why do I keep printing out the Memory Address instead of the value in the arrayC - 为什么我一直打印出内存地址而不是数组中的值
【发布时间】:2017-03-28 22:44:25
【问题描述】:

我无法打印出存储在数组中的值。它似乎正在打印出内存地址。这是我的代码:

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

void getMatrix(int x, int y);
void printMatrix(int arr[], int x, int y);
int product(int arr1[], int arr2[]);

int main(void){

 //Variables that will store matrix size
 int m, n, o, p;

 //Prompt user for size of Matrix A
 printf("Enter the rows and columns of Matrix A with space in between: ");

 //Read input
 scanf("%d %d", &m, &n);

 //Prompt user for the size of Matrix B
 printf("Enter the rows and columns of Matrix B with space in between: ");

 //Read input
 scanf("%d %d", &o, &p);

 //Seed RND Generator
 srand(time(NULL));

 //Check input
 if(n != o){
  while(n != o){
   printf("Matrix Sizes are not valid. Please enter valid sizes for the Matrices: ");
   scanf("%d %d %d %d", &m, &n, &o, &p);
  }
 } 

 //Function Calls
 printf("Matrix 1:\n");
 getMatrix(m, n);
 printf("\nMatrix 2:\n");
 getMatrix(o, p);
}

void getMatrix(int x, int y){

 //Counter
 int c;

 //Size Declaration
 int size = x * y;

 //Array Declaration
 int arr[size];

 for(c = 0; c < size; c++){
  arr[c] = rand()%10;
 }

 printMatrix(arr[size], x, y);
}

void printMatrix(int arr[], int x, int y){

 //Counters
 int i, j;

 for(i = 0; i < y; i++){
  printf("\n");
  for(j = 0; j < x; j++){
   printf("%d ", arr[j]);
  }
 }
}

所以基本上这段代码应该接受输入并创建一个可变长度数组,它应该将随机数存储在一维数组中,然后它们必须以二维数组或矩阵的形式打印出来。我感觉printMatrix函数的参数或者传递getMatrix函数中得到的数组时可能有问题。任何帮助将不胜感激,谢谢。

编辑:谢谢大家的帮助。我什至没有考虑将其用作解决方案。但它现在可以工作并打印出它应该打印的数字。再次感谢

【问题讨论】:

  • 我确信编译器在向你抱怨,而你却忽略了它的抱怨,它试图提供帮助。它在这条线上抱怨printMatrix(arr[size],...
  • 尝试将printMatrix(arr[size], x, y);更改为printMatrix(arr, x, y);
  • 您应该会收到 printMatrix(arr[size], x, y); 行的错误。如果你不这样做,那么首先要做的是调整你的编译器设置,直到你得到一个错误。然后修复错误。
  • 在getMatrix(): printMatrix(arr[size], x, y); --> printMatrix(arr, x, y); 和printMatrix(): printf("%d ", arr[j]); --> printf("%d ", arr[i * x + j]);
  • 我试过使用'printMatrix(&arr[size], x, y);'而不仅仅是 'arr[size]' 并且确实消除了所有编译器注释和错误,但它仍然不会打印出数组中的随机数

标签: c arrays


【解决方案1】:

此声明

int arr[size];

说arr 是size ints 的数组。因此,

printMatrix( arr[size], x, y );

传递 值,该值恰好是第一个 int 就在外面 arr 将用于第一个参数,函数将其解释为地址要打印的数组。

另外,请注意printMatrix 会不断打印第一行,而不是每个连续的行。

【讨论】:

    【解决方案2】:

    我认为问题出在这行代码上:

    printMatrix(arr[size], x, y);
    

    应该是

    printMatrix(arr, x, y);
    

    printMatrix 函数需要一个数组,但在您的代码中,您从数组中传递一个元素。

    【讨论】:

      【解决方案3】:

      你在下面这行做了什么:

      printMatrix(arr[size], x, y);
      

      正在调用未定义的行为。由于您已将数组声明为arr[size],因此您数组的计数器的范围必须从0 到size - 1。

      当您尝试传递 arr[size],而不是传递整个数组(从程序判断,这就是您希望它做的事情)时,您在元素 size处传递 arr >,这是一个超出范围的索引。

      进一步解释为什么会发生这种情况,分配给arr 的块之后的内存空间必须是空的,所以你不会遇到分段错误,而是你得到的地址那个越界元素。但是,如果它被填满,那么就会导致分段错误,并导致运行时错误。

      要传递arr,需要去掉索引说明符:

      printMatrix(arr, x, y);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-10
        • 2021-01-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-08
        相关资源
        最近更新 更多