Tag: 数组

取消引用void指针

为了更好地理解这篇文章中给出的答案,有人可以向我解释是否可以实现以下循环缓冲区,如果没有,为什么不能。 #define CB_TYPE_CHAR 0 #define CB_TYPE_FLOAT 1 … typedef struct CBUFF { uint16 total; /* Total number of array elements */ uint16 size; /* Size of each array element */ uint16 type; /* Array element type */ uint16 used; /* Number of array elements in use */ uint16 start; /* Array index of first unread […]

什么时候确定指针差异?

我有一个关于指针差异和结果类型的问题, ptrdiff_t 。 C99§6.5.6(9)说: 当减去两个指针时,两个指针都指向同一个数组对象的元素,或者指向数组对象的最后一个元素的元素; 结果是两个数组元素的下标的差异。 结果的大小是实现定义的,其类型(有符号整数类型)是标头中定义的ptrdiff_t 。 如果结果在该类型的对象中无法表示,则行为未定义。 换句话说,如果表达式P和Q分别指向数组对象的第i和第j个元素,则表达式(P) – (Q)具有值i-j,条件是该值适合于ptrdiff_t类型的对象。 §7.18.3(2)要求ptrdiff_t的范围至少为[-65535,+ 65535] 我感兴趣的是如果结果太大则未定义的行为。 我无法在标准中找到任何保证至少与size_t的签名版本或类似内容相同的范围。 所以,现在我的问题是:一致的实现是否可以使ptrdiff_t成为带符号的16位类型但size_t 64位? [编辑:正如Guntram Blohm所指出的那样,16位有符号最多会产生32767,所以我的例子显然不符合]据我所知,我不能在严格符合代码甚至超过65535个元素的数组上做任何指针减法如果实现支持比这大得多的对象。 此外,该程序甚至可能崩溃。 理由(V5.10)§6.5.6说: 重要的是要对这种类型[ ptrdiff_t ]进行签名,以便在处理同一数组中的指针时获得正确的代数排序。 但是,指针差异的大小可以与可以声明的最大对象的大小一样大; 由于这是一个无符号类型,两个指针之间的差异可能会导致某些实现溢出。 这可以解释为什么不需要指定每个指针差异(对同一个数组的元素),但是它没有解释为什么对PTRDIFF_MAX没有限制至少为SIZE_MAX/2 (具有整数除法) 。 为了说明,假设T是任何对象类型,并且n是在编译时未知的size_t对象。 我想为T n对象分配空间,我想用指定范围内的地址进行指针减法。 size_t half = sizeof(T)>1 ? 1 : 2; // (*) if( SIZE_MAX/half/sizeof(T)<n ) /* do some error handling */; size_t size = […]

查找作为c 中函数的参数接收的整数数组的大小

我想找到作为函数的参数传递的整数数组的大小。 这是我的代码 void getArraySize(int arr[]){ int len = (sizeof(arr)/sizeof(arr[0]) printf(“Array Length:%d\n”,len); } int main(){ int array[] = {1,2,3,4,5}; getArraySize(array); return 0; } 我收到以下警告 sizeof on array function parameter will return size of ‘int *’ instead of ‘int []’ [-Wsizeof-array-argument] 请帮助,以便我可以在function getArraySize找到整数数组的长度但是我能够在main函数中找到array的大小。因为它是作为pointer传递的,所以我无法在function 。 我确实有一个想法。我可以把它放在一个try/catch块( C没有try catch,只有依赖OS的跳线 )并循环直到我得到一个segmentation fault 。 有没有其他方法可以用来找到function内部的integer array的长度

可以在没有明确大小的情况下初始化C中的二维数组吗?

我有一个关于C中的二维数组的问题。我现在知道(从直接编译器经验)我不能像这样一维数组初始化这样的数组: int multi_array[][] = { {1,2,3,4,5}, {10,20,30,40,50}, {100,200,300,400,500} }; > compiler output: gcc -o arrays arrays.c arrays.c: In function ‘main’: arrays.c:8:9: error: array type has incomplete element type 最接近的解决方案是明确提供列数如下: int multi_array[][5] = { {1,2,3,4,5}, {10,20,30,40,50}, {100,200,300,400,500} }; 我的问题是:如果不明确地提供数字(这毕竟编译器应该能够推断自己),它可以整齐地完成吗? 我不是在谈论用malloc或其他东西手工构建它,而是与我尝试的东西接近。 另外,对C编译器有所了解的人可以从低级别的角度解释为什么我的初始尝试不起作用吗? 我使用了没有非标准选项的普通gcc来编译代码。 谢谢

使用带有数组和指针的sizeof的实验

对于该计划: #include int main(void) { int (*a)[2]; int b[5]; printf(“sizeof(int) : %zu\n”, sizeof(int)); printf(“sizeof(int*) : %zu\n”, sizeof(int*)); printf(“sizeof(b) : %zu\n”,sizeof(b)); printf(“sizeof((int*)b) : %zu\n”,sizeof((int*)b)); printf(“sizeof(&b[0]) : %zu\n”,sizeof(&b[0])); printf(“sizeof(a) : %zu\n”,sizeof(a)); printf(“sizeof(a[0]) : %zu\n”,sizeof(a[0])); printf(“sizeof(a[1]) : %zu\n”,sizeof(a[1])); return 0; } 输出是: sizeof(int) : 4 -> Fact 1 sizeof(int*) : 8 -> Fact 2 sizeof(b) : 20 -> […]

C错误“可能无法初始化可变大小的对象”

可能重复: C编译错误:“可能无法初始化可变大小的对象” 我有一个问题,因为我的编译器仍然给我一个错误:可能无法初始化变量大小的对象。 我的代码出了什么问题? int x, y, n, i; printf (“give me the width of the table \n”); scanf (“%d”, &x); printf (“give me the height of the table\n”); scanf (“%d”, &y); int plansza [x][y] = 0; int plansza2 [x][y] = 0; 当然我想用“零”填充表格。 不幸的是,该计划仍然无效。 这些表格在所有单元格中显示为“416082”等数字。 我的代码现在看起来像这样: int plansza [x][y]; memset(plansza, 0, sizeof plansza); int plansza2 […]

为什么大的可变长度数组具有固定值-1,即使在C中赋值?

我正在尝试在c中创建一个可变大小的数组。 数组继续返回,其值为-1。 我想要做的是创建一个大小的数组,然后逐步添加值。 我究竟做错了什么? int size = 4546548; UInt32 ar[size]; //soundStructArray[audioFile].audioData = (UInt32 *)malloc(sizeof(UInt32) * totalFramesInFile); //ar=(UInt32 *)malloc(sizeof(UInt32) * totalFramesInFile); for (int b = 0; b < size; b++) { UInt32 l = soundStructArray[audioFile].audioDataLeft[b]; UInt32 r = soundStructArray[audioFile].audioDataRight[b]; UInt32 t = l+r; ar[b] = t; }

正确的方法来分配和释放指向数组的指针

我想创建一个指向3个浮点数组的指针数组。 这样做的正确方法是什么? float *array1[SIZE]; // I think it is automatically allocated // OR float **array1 = calloc(SIZE, sizeof(float*)); free(array1); for (int i = 0; i < SIZE; i++) { array1[i] = (float[]){0,0,0}; // OR array1[i] = calloc(3, sizeof(float)); } 那么我将如何释放数据呢? 我很确定只有free(array1); 不会工作,所以我会释放数组中的每个指针然后释放数组,或者因为我分配了三个浮点数,我会释放每个浮点数,然后每个3浮点数组,然后整个数组???

技巧:使用宏填充数组值(代码生成)

C ++模板是伪装的宏吗? 我正在阅读上面的主题,突然想到了这个想法:为什么不尝试编写一些可以在我们的真实代码中使用的棘手宏(不仅仅是作为现实生活中无用的谜题)? 所以首先想到的是:用宏填充数组值: int f(int &i) { return ++i; } #define e100 r5(m20) #define m20 m5,m5,m5,m5 #define m5 r5(e1) #define e1 f(i) //avoiding ++i right here, to avoid UB! #define r5(e) e,e,e,e,e int main() { int i=0; //this is used in the macro e1 int a[] = {e100}; //filling array values with macros! int […]

使用stdlib的qsort()对字符串数组进行排序

一些序言:我是一名计算机工程专业的学生,​​经过3个学期的Java(直到数据结构),在C学习第一堂课。 这个问题与家庭作业有关,但是为我解决了几个步骤。 我有一个输入文件,我读入内存,它存储在char [9] [500]。 我读入最多500个最大长度为8的字符串。我试图使用stdlib内置的qsort()函数对这个数组进行排序,并且有一些内存错误。 重要的代码片段: char data[4][500][60]; char debug[500][9]; size_t count = 0; /* initialize file, open for reading */ FILE* pUserlog; pUserlog = fopen(“userlog”,”r”); while(!feof(pUserlog)) { fscanf(pUserlog, “%9s %8s %16s”,debug[count], data[1][count], data[2][count]); fgets(data[3][count], 60, pUserlog); count++; } 本节将数据读入数组。 这部分感兴趣的数组是“debug”。 这是上面指定的数组。 这是我的qsort比较函数: int compare(const void* a, const void* b) { const char **ia […]