C 如何定义全局数组(从另一个函数获取长度)?
如何编写一个具有全局数组的C代码,该数组的长度从main()开始作为用户输入 我尝试了很多不同的方法,但迄今为止没有一种有效,例如:C 如何定义全局数组(从另一个函数获取长度)?,c,arrays,data-structures,global-variables,C,Arrays,Data Structures,Global Variables,如何编写一个具有全局数组的C代码,该数组的长度从main()开始作为用户输入 我尝试了很多不同的方法,但迄今为止没有一种有效,例如: #include <stdio.h> const int length; int array[length]; int main() { scanf("%d",&length); } #包括 常量int长度; 整数数组[长度]; int main() { 扫描频率(“%d”和长度); } 你显然不能。当length得到它的值时,您
#include <stdio.h>
const int length;
int array[length];
int main()
{
scanf("%d",&length);
}
#包括
常量int长度;
整数数组[长度];
int main()
{
扫描频率(“%d”和长度);
}
你显然不能。当length
得到它的值时,您是否希望内存分配能够神奇地向后、向后地发生
这不是C的工作原理,也不是那么抽象
您必须使数组只是一个指针(然后可以在需要时声明extern
),并将长度作为一个单独的变量,而且extern
您显然不能。当length
得到它的值时,您是否希望内存分配能够神奇地向后、向后地发生
这不是C的工作原理,也不是那么抽象
您必须使数组只是一个指针(然后可以在需要时声明extern
),并将长度作为一个单独的变量,也就是extern
参考您的代码,我可以指出:
int array[length];
这当然行不通,因为在编译时,数组的大小是未知的。您不能静态地定义大小不确定的数组(从编译过程中编译器的角度来看)
如果您想决定数组运行时的大小(即动态地),您不能通过声明变量的方式来决定
另外,将const
与length
一起使用在这里也不起作用。摆脱常量const
您可以而且应该做的是,获取一个int
指针,并获取动态分配的内存的起始地址。
你可以用这个函数
我不会为您编写完整的代码,但它应该包含如下内容:
int *ptr = malloc(length * sizeof(int));
从这里开始,如果用户输入了10(例如,length
=10),并且malloc
没有返回NULL
,那么您应该能够从存储在ptr
指针中的地址开始存储最多10个整数,当然,还可以通过增加指针ptr
来访问它们
如果您阅读了malloc
的任何手册页面,您应该能够处理所需的头文件。我不是在写您需要的文件,因为我希望您自己阅读手册页和代码。参考您的代码,我可以指出:
int array[length];
这当然行不通,因为在编译时,数组的大小是未知的。您不能静态地定义大小不确定的数组(从编译过程中编译器的角度来看)
如果您想决定数组运行时的大小(即动态地),您不能通过声明变量的方式来决定
另外,将const
与length
一起使用在这里也不起作用。摆脱常量const
您可以而且应该做的是,获取一个int
指针,并获取动态分配的内存的起始地址。
你可以用这个函数
我不会为您编写完整的代码,但它应该包含如下内容:
int *ptr = malloc(length * sizeof(int));
从这里开始,如果用户输入了10(例如,length
=10),并且malloc
没有返回NULL
,那么您应该能够从存储在ptr
指针中的地址开始存储最多10个整数,当然,还可以通过增加指针ptr
来访问它们
如果您阅读了malloc
的任何手册页面,您应该能够处理所需的头文件。我不是在写您需要的文件,因为我希望您自己阅读手册页和代码。您需要使用malloc创建一个动态数组来解决此问题,如以下示例所示
#include<stdio.h>
#include<stdlib.h>
int *array;
main()
{
int length;
scanf("%d",&length);
array = (int *)malloc (length*sizeof(int));
// array[0] = 100;
}
#包括
#包括
int*数组;
main()
{
整数长度;
扫描频率(“%d”和长度);
数组=(int*)malloc(长度*sizeof(int));
//数组[0]=100;
}
我假设您的数组长度适合整数范围,或者相应地更改。您需要使用malloc创建一个动态数组来解决此问题,如以下示例所示
#include<stdio.h>
#include<stdlib.h>
int *array;
main()
{
int length;
scanf("%d",&length);
array = (int *)malloc (length*sizeof(int));
// array[0] = 100;
}
#包括
#包括
int*数组;
main()
{
整数长度;
扫描频率(“%d”和长度);
数组=(int*)malloc(长度*sizeof(int));
//数组[0]=100;
}
我假设您的数组长度适合整数范围,或者相应地更改。在文件范围(任何函数体之外)声明的数组具有静态
存储持续时间,这意味着在执行任何语句之前,程序一启动就为它们分配空间。因此,必须在编译时知道它们的大小
如果您想分配全局可见但在运行时之前不会调整大小的内存,则必须使用动态内存分配
#include <stdio.h>
#include <stdlib.h>
int *array; // personally, I would name these something like
size_t length; // g_array and g_length to emphasize their "global-ness"
// and disambiguate them from any local variables.
int main( void )
{
// get length value somehow
array = malloc( sizeof *array * length );
if ( !array )
{
// Could not allocate memory, handle as appropriate
}
// do stuff with array
free( array );
return 0;
}
#包括
#包括
int*数组;//就我个人而言,我会把这些命名为
大小与长度;//g_数组和g_长度以强调其“全局性”
//并从任何局部变量中消除它们的歧义。
内部主(空)
{
//以某种方式获取长度值
数组=malloc(sizeof*数组*长度);
if(!数组)
{
//无法分配内存,请根据需要处理
}
//用数组做东西
自由(数组);
返回0;
}
在文件作用域(任何函数体之外)声明的数组具有静态
存储持续时间,这意味着在执行任何语句之前,程序一启动就为它们分配空间。因此,必须在编译时知道它们的大小
如果您想分配全局可见但在运行时才调整大小的内存,则必须使用动态内存