无法在 for 循环中打印出数组的元素
Can not print out the elements of an array in a for-loop
为什么我不能在 for
循环中打印出数组的元素?
我的环境是Windows 7最大值,
gcc (MinGW.org GCC-6.3.0-1) 6.3.0
我从 3 1 2 3
这样的提示中输入数据。
我可以做到,例如,printf("%" PRId64 " ", marray[2])
但是从 for
循环它不起作用。
这里是源代码:
#define __USE_MINGW_ANSI_STDIO 1
#define __STDC_FORMAT_MACROS 1
#include <inttypes.h>
#include <stdio.h>
#include <stdlib.h>
size_t read_size() {
size_t x;
scanf("%lu", &x);
return x;
}
int64_t read_int64() {
int64_t x;
scanf("%" SCNd64, &x);
return x;
}
int main() {
size_t *size;
*size = read_size();
int64_t *marray = malloc(sizeof(int64_t) * *size);
for (size_t i = 0; i < *size; i++) {
marray[i] = read_int64();
}
for (size_t i = 0; i < *size; i++) {
printf("%" PRId64 " ", marray[i]);
}
free(marray);
return 0;
}
首先,在 main()
你有:
size_t *size; //creating an uninitialized pointer
那你打电话给
*size = read_size();
^ (dereferencing an uninitialized pointer
这将导致未定义的行为。 (read about nasal demons here。基本上任何事情都可能在这里发生。在我的系统上,这是一个 run-time 错误。(...Local 'size' was referenced before being initialized.
)注意:如果你不看到类似的东西,打开你的编译器警告。
所以,正如评论中指出的那样,无论如何,在这里使用指针并不是正确的方法...
*size = read_size();
建议更改以下内容:
size_t read_size(){
size_t x;
scanf("%lu", &x);
return x;
}
收件人:
size_t read_size(void){//note, its portable to include `void` in `void` prototypes
size_t x;
scanf("%zu", &x); //zu, not lu for size_t format specifier
return x;
}
然后这样称呼它:
//size_t* size;
size_t size = read_size();
然后也改变这些:
int64_t* marray = malloc(sizeof(int64_t)**size);
...
for (size_t i = 0; i < *size; i++){
至:
int64_t* marray = malloc(sizeof(int64_t) * size);
if(marray)
{//always verify successful call before attempting to use memory
...
for (size_t i = 0; i < size; i++){//removed the dereference on size
编辑 - 注释表明需要动态创建二维数组:
评论表明您的意图是
int64_t* marray = malloc(sizeof(int64_t)**size);
创建一个二维数组。该语句只会创建一个单维数组,并且可能不是您想象的大小。
一般来说,创建一个指向数组的指针,然后创建指向每一列的指针...(例如,不知道两个维度,下面将创建两个size
)
int rows = size
int cols = size
int64_t **marray = malloc(sizeof(int64_t) * rows*cols);
if(!marray)//handle error
{
for(int i = 0; i < cols ; i++)
{
marray[i] = malloc( rows * sizeof(int64_t));
if(!marray[i]) //handle error;
}
}
此方法近似于评论中指出的方法,但 IMO 这不是最佳方法。它为每次调用 malloc 创建 non-contiguous 个内存块,并且每次调用 malloc()
都需要调用一次 free()
。一个更好的方法 。 (仅调用一次 malloc()
/free()
来创建和释放二维数组。)
为什么我不能在 for
循环中打印出数组的元素?
我的环境是Windows 7最大值,
gcc (MinGW.org GCC-6.3.0-1) 6.3.0
我从 3 1 2 3
这样的提示中输入数据。
我可以做到,例如,printf("%" PRId64 " ", marray[2])
但是从 for
循环它不起作用。
这里是源代码:
#define __USE_MINGW_ANSI_STDIO 1
#define __STDC_FORMAT_MACROS 1
#include <inttypes.h>
#include <stdio.h>
#include <stdlib.h>
size_t read_size() {
size_t x;
scanf("%lu", &x);
return x;
}
int64_t read_int64() {
int64_t x;
scanf("%" SCNd64, &x);
return x;
}
int main() {
size_t *size;
*size = read_size();
int64_t *marray = malloc(sizeof(int64_t) * *size);
for (size_t i = 0; i < *size; i++) {
marray[i] = read_int64();
}
for (size_t i = 0; i < *size; i++) {
printf("%" PRId64 " ", marray[i]);
}
free(marray);
return 0;
}
首先,在 main()
你有:
size_t *size; //creating an uninitialized pointer
那你打电话给
*size = read_size();
^ (dereferencing an uninitialized pointer
这将导致未定义的行为。 (read about nasal demons here。基本上任何事情都可能在这里发生。在我的系统上,这是一个 run-time 错误。(...Local 'size' was referenced before being initialized.
)注意:如果你不看到类似的东西,打开你的编译器警告。
所以,正如评论中指出的那样,无论如何,在这里使用指针并不是正确的方法...
*size = read_size();
建议更改以下内容:
size_t read_size(){
size_t x;
scanf("%lu", &x);
return x;
}
收件人:
size_t read_size(void){//note, its portable to include `void` in `void` prototypes
size_t x;
scanf("%zu", &x); //zu, not lu for size_t format specifier
return x;
}
然后这样称呼它:
//size_t* size;
size_t size = read_size();
然后也改变这些:
int64_t* marray = malloc(sizeof(int64_t)**size);
...
for (size_t i = 0; i < *size; i++){
至:
int64_t* marray = malloc(sizeof(int64_t) * size);
if(marray)
{//always verify successful call before attempting to use memory
...
for (size_t i = 0; i < size; i++){//removed the dereference on size
编辑 - 注释表明需要动态创建二维数组:
评论表明您的意图是
int64_t* marray = malloc(sizeof(int64_t)**size);
创建一个二维数组。该语句只会创建一个单维数组,并且可能不是您想象的大小。
一般来说,创建一个指向数组的指针,然后创建指向每一列的指针...(例如,不知道两个维度,下面将创建两个size
)
int rows = size
int cols = size
int64_t **marray = malloc(sizeof(int64_t) * rows*cols);
if(!marray)//handle error
{
for(int i = 0; i < cols ; i++)
{
marray[i] = malloc( rows * sizeof(int64_t));
if(!marray[i]) //handle error;
}
}
此方法近似于评论中指出的方法,但 IMO 这不是最佳方法。它为每次调用 malloc 创建 non-contiguous 个内存块,并且每次调用 malloc()
都需要调用一次 free()
。一个更好的方法 malloc()
/free()
来创建和释放二维数组。)