Tag: 数组

通过指针算法计算数组长度

我想知道*(&array + 1)实际上是如何工作的。 我认为这是一种计算数组长度的简单方法,并希望在使用之前正确理解它。 我对指针算法不太熟悉,但是我的理解&array给出了&array第一个元素的地址。 (&array + 1)将根据地址到达数组的末尾。 但不应该*(&array + 1)给出该地址的值。 而是打印出地址。 我非常感谢你的帮助,让我的脑袋里的指针清晰。 这是我正在研究的简单示例: int numbers[] = {5,8,9,3,4,6,1}; int length = *(&numbers + 1) – numbers;

C中二维数组声明中的歧义

我已经用以下格式定义了数组,但显然该程序仅在CASE B中正常工作。 案例A: int **M1; M1 = (int **)malloc(m * sizeof(int *)); for (int i=0; i<m; i++){ M1[i] = (int *)malloc(d * sizeof(int)); } 案例B: int (*M1)[m] = malloc(sizeof(int[m][d])); 我在CASE A中遇到了分段错误。可能是什么原因?

C编译器如何知道char ** x指向一个数组?

在C中,我读过char** x和char* x[]含义完全相同。 我理解第二个例子,但我不明白第一个例子。 对我来说,第一个例子是“指向指向字符的指针”,但C会将其视为“指向字符数组的指针列表”? 有人能够以外行的方式向我解释这一点,因为我一直有一个exception困难的时间把握它。 编辑:我承认我说的第一点是我认为人们想要听到的而不是我的实际解释。 我也把它看作是指向char的指针,但是当我在这个问题上读到最佳答案时,我的理解就下降了: char * argv []和char ** argv之间的区别是main()的第二个参数 这表明当用作参数向量时,它被用作指向字符指针数组的指针…

多维数组和指针数组之间的区别

我一直相信在C: int a[5][3]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}; 指的是一个数组数组,在存储器中存储了十五个连续的块,但是a[0]是指向a[0][0]的指针,而a[1]是指向a[1][0]的指针,依此类推。 所以我认为它类似于一个指针数组。 它们之间有什么区别?

防止分配数组的理由是什么?

我试过谷歌这个并阅读: 为什么不能分配相同类型和大小的数组? 分配数组 在c中分配给struct中的数组 但他们都说得很明显:你不能分配给数组,因为标准是这样说的。 这很好,但我想知道为什么标准不包括对分配数组的支持。 标准委员会详细讨论了一些事情,如果他们从未讨论过让arrays可分配,我会感到惊讶。 假设他们已经讨论过,他们必须有一些理由不让数组被分配。 我的意思是,我们可以将一个数组放在一个结构中并分配给结构就好了: struct wrapper { int array[2]; }; struct wrapper a = {{1, 2}}; struct wrapper b = {{3, 4}}; a = b; // legal 但是禁止直接使用数组,即使它有效地完成了同样的事情: int a[2] = {1, 2}; int b[2] = {3, 4}; a = b; // Not legal 标准委员会禁止分配数组的理由是什么?

C – 从函数返回数组

我正在尝试创建一个在C中返回字符串数组的函数。我在网站上查看了一些其他问题并尝试了一些解决方案,但似乎没有任何效果。 我已经尝试过(1)只是更改函数来更改数组内容而不是返回它,我已经尝试过(2)显式返回arrayz,但似乎都不起作用。 方法#1:在一个文件中,function: int getArray(int num, char** array) { int i; for (i = 0; i < num; i++) array[i] = "whatever"; return 0; } 在另一个文件中,我调用该函数: char** array = malloc(sizeof(char*) * num)); getArray(num, files); 当我尝试打印数组文件的内容时,没有任何显示。 方法#2:在一个文件中,function: char** getArray(int num) { int i; char** array = malloc(sizeof(char*) * num)); for (i = 0; i < num; […]

回溯算法在寻找gradle生最低学期数中的应用

我正在从包含的文件中获取输入 每学期没有课程和最多允许课程 所有课程名称(最多5个字母数字) couse name,提供的sem,先决条件,Prereq课程。 -1和-1结尾输出将是完成所有课程的最小学期数。 这是我的代码,所以你知道我已经完成了工作。 我的代码正在编译和执行,但没有显示完成课程的sems数。 请告诉我我在哪里做错了 #include #include #include #include #include char garbage[12][6]; char courseIdentifier[12][6],prereqIdentifier[12][5][6]; char semOffered[12]; bool done[12]; bool allDone(int); bool donePrereq(int,int); int main(void) { FILE *fp; fp = fopen(“graduate.in”,”r”); int n,m,p; int i,j,k; for(i=0;i<12;i++) { strcpy(courseIdentifier[i],""); } for(i=0;i<12;i++) { for(j=0;j<5;j++) { strcpy(prereqIdentifier[i][j],""); } } fscanf(fp,"%d %d",&n,&m);// take n,m while(n != […]

涉及指针和数组的两个声明之间的区别

int *a[3]和int (*a)[3]之间有什么区别?

MPI_Allgather和动态结构

我想用MPI_Allgather()发送一个结构数组,但我的结构有一个动态数组: typedef struct { float a; int* b; } structure_t; 我的结构通过以下方式初始化: structure_t *resultat = (structure_t*) malloc( sizeof( structure_t ) + n * sizeof( int ) ); 但是如何使用MPI_Allgather发送我的结构? 如何创建两个(发送和接收)数组?

为什么零长度VLA UB?

2011年标准明确规定…… 6.7.6.2数组声明符 如果size是一个不是整数常量表达式的表达式:如果它出现在函数原型范围的声明中,则将其视为*被替换为* ; 否则,每次评估它时,其值应大于零。 变长数组类型的每个实例的大小在其生命周期内不会改变。 如果size表达式是sizeof运算符的操作数的一部分,并且更改size表达式的值不会影响运算符的结果,则无法指定是否计算size表达式。 这是设计的,但以下代码似乎是合理的。 size_t vla(const size_t x) { size_t a[x]; size_t y = 0; for (size_t i = 0; i < x; i++) a[x] = i; for (size_t i = 0; i < x; i++) y += a[i % 2]; return y; } Clang似乎为它生成合理的x64程序集(没有优化)。 显然索引零长度VLA没有意义,但访问超出边界会调用未定义的行为。 为什么零长度数组未定义?