Tag: 数组

别名结构和数组是否合法?

在结构中相同类型的连续成员之间的指针算术过去常常是一种常见的做法,而指针算术仅在数组内有效。 在C ++中,它将是明确的Undefined Behavior,因为数组只能由声明或新表达式创建。 但是C语言将数组定义为具有特定成员对象类型的连续分配的非空对象集,称为元素类型。 (n1570 C11草案,6.2.5类型§20)。 因此,如果我们可以确保成员是连续的(意味着它们之间没有填充),那么将其视为数组是合法的。 这是一个简化的示例,它在没有警告的情况下编译,并在运行时给出预期的结果: #include #include #include struct quad { int x; int y; int z; int t; }; int main() { // ensure members are consecutive (note 1) static_assert(offsetof(struct quad, t) == 3 * sizeof(int), “unexpected padding in quad struct”); struct quad q; int *ix = &q.x; for(int i=0; […]

在像C这样的编程语言的上下文中,数组数据结构和数组数据类型之间有什么区别?

Wikipedia区分arrays数据结构和arrays数据类型 。 在像C这样的编程语言的上下文中,数组数据结构和数组数据类型之间有什么区别? 这是什么: int array[]={1, 2, 3, 4, 5}; ? 它是arrays数据结构还是arrays数据类型? 为什么?

c中的动态与静态数组

以下代码使用malloc函数创建一个数组。 但我知道只需int array [size]就可以做得更简单。 我认为这是静态数组。 但是用malloc函数是动态数组吗? 我在网上发现了这个代码……真正发生了什么,以及静态数组和动态数组(以及堆内存之间的静态内存)之间的区别。 你可以在运行时更改动态数组的大小吗? 或者…我完全不知道…如果有人能解释我会很感激:) #include #include #include int main(void) { int size; int i; printf(“Choose size of array: “); scanf(“%d”,&size); /*—MALLOC/FREE—*/ int *m_array = (int *)malloc((size+1)*sizeof(int)); memset(m_array,’\0′,size+1); for(i=0; i<size ; i++) { m_array[i]=i; printf("%d ",m_array[i]); } printf("\n"); free(m_array); return 0; }

指针数组的动态内存分配

我正在尝试编写一个程序,该程序从文本文件中读取一系列字符串,并将它们存储在字符串数组中,为每个元素动态分配内存。 我的计划是使用指针将每个字符串存储在一个数组中,然后在读入更多数据时增大数组大小。我很难理解为什么我的测试代码无效。 这是一个可行的想法吗? char *aPtr; aPtr =(char*)malloc(sizeof(char)); aPtr[0]=”This is a test”; printf(“%s”,aPtr[0]);

c中数组的最大大小是否有限制?

可能重复: C编程,为什么这个大型数组声明会产生分段错误? 我正在用c语言阅读图像,但我无法这样做,因为我的程序停止在…之间调试后我发现它是由于数组大小…是否对数组的最大大小有任何限制? 如果我声明大小为1400X1400的数组一切正常但如果我定义大小为1600X1400的数组我的程序停止工作……为什么它是这样…编译器或操作系统对数组大小有任何限制? 如果是这样,c的解决方案是什么。 unsigned char idata[1400][1400]; //working fine unsigned char idata[1600][1400]; //not working

指针到数组重叠的数组末尾

这段代码是否正确? int arr[2]; int (*ptr)[2] = (int (*)[2]) &arr[1]; ptr[0][0] = 0; 显然,通过访问超出范围的arr ptr[0][1]将是无效的。 注意:毫无疑问, ptr[0][0]指定的内存位置与arr[1] ; 问题是我们是否被允许通过ptr访问该内存位置。 下面是一些表达式确定指定相同内存位置但不允许以这种方式访问​​内存位置的示例。 注2:还要考虑**ptr = 0; 。 正如Marc van Leeuwen所指出的, ptr[0]相当于*(ptr + 0) ,但是ptr + 0似乎与指针运算部分相悖。 但是通过使用*ptr代替,可以避免这种情况。

编写一个函数的原型,该函数采用正好16个整数的数组

其中一个面试问题让我“编写一个C函数的原型,它采用了16个整数的数组”,我想知道它可能是什么? 也许像这样的函数声明: void foo(int a[], int len); 或者是其他东西? 如果语言是C ++而不是呢?

C:如何为具有可变参数计数的函数使用单个函数指针数组?

这个问题几乎说明了一切。 我不确定如何做到这一点,并没有任何有效的东西。 这是一些示例函数: add(int x, int y) { return x+y; } 和, mean(int x1, int y1, int x2, int y2) { return (x1 + y1 + x2 + y2) / 4; } 到目前为止,我已尝试将typedef与两者一起使用,但我无法想象如何使某些东西指向其中一种类型: typedef int (*mathfunc2)(int x, int y); typedef int (*mathfunc4)(int x1, int y1, int x2, int y2); ????? func_table[2] = {add, mean};

为什么我可以在函数内而不是在main中增加char数组位置

这个函数参数stringLength(char string [])与stringLength(char * string)之间有什么区别,第一个不应该允许增量(string = string +1)对下面的代码有注释? #include #include #include int stringLength(char string[]) { int length = 0; while(*string) { string = string + 1; // I can do it here length++; } return length; } int main(void){ char s[] = “HOUSE”; s = s + 1; // I can not do it here […]

在C中排序后跟踪数组的原始索引

我有一个数组让我们说A[5] ,5个元素是5,4,1,2,3 。 现在我按升序对这些数组进行排序。 所以结果数组现在是1,2,3,4,5 。 我使用stdlib.h qsort()函数stdlib.h进行排序。 问题是我如何获得原始数组相对于我的新数组的索引。 最初我的指数是0,1,2,3,4 ,相应的值为5,4,1,2,3 ,现在指数已经变为2,3,4,1,0。 如何在C中有效地获得这些指数? 提前谢谢(如果可能,请写下代码)