我在函数名myalloc()中分配一些内存,并在main()中使用和释放它。 我正在使用双指针来执行此操作,这里的代码工作正常, //Example # 1 #include #include #include void myalloc( char ** ptr) { *ptr = malloc(255); strcpy( *ptr, “Hello World”); } int main() { char *ptr = 0; myalloc( &ptr ); printf(“String is %s\n”, ptr); free(ptr); return 0; } 但是下面的代码不起作用并给出了分段错误。 我认为这是使用双指针的另一种方法。 //Example # 2 #include #include #include void myalloc( char ** ptr) { *ptr […]
我正在努力学习C,作为一个开始,我开始为自己的练习写一个strcpy。 我们知道,原来的strcpy容易出现安全问题所以我给自己写了一个“安全”strcpy的任务。 我选择的路径是检查源字符串(字符数组)是否实际适合目标内存。 正如我所理解的,C中的字符串只不过是指向字符数组的指针,0x00终止。 所以我的挑战是如何找到编译器实际为目标字符串保留了多少内存? 我试过了: sizeof(dest) 但这不起作用,因为它将返回(我后来发现)dest的大小,它实际上是一个指针,在我的64位机器上,将始终返回8。 我也尝试过: strlen(dest) 但这不起作用,因为它只会返回长度,直到遇到第一个0x0,这不一定反映保留的实际内存。 所以这一切总结为以下问题:如何找到编译器为我的目标“字符串”保留了多少内存? 例: char s[80] = “”; int i = someFunction(s); // should return 80 什么是“someFunction”? 提前致谢!
让我们说我在这个场景中: main.c: #include #include #include “header.h” int iCanProcess (char* gimmeSmthToProcess); int processingFunctionsCount = 0; int (*(*processingFunctions)) (char*) = NULL; int addProcessingFunction(int (*fct)(char*)) { processingFunctionsCount++; processingFunctions = realloc(processingFunctions, sizeof(int (*)(char*))*ProcessingFunctionsCount); processingFunctions[processingFunctionsCount-1] = fct; } int main(int argc, char *argv[]) { char* dataToProcess = “I am some veeeery lenghty data”; addProcessingFunction(iCanProcess); [ … ] for(unsigned int i […]
我是C ++的新手,只是试图抓住它。 它通常看起来不是太糟糕,但我偶然发现了这种奇怪/病态的segfaulting行为: int main () { int* b; *b = 27; int c = *b; cout << "c points to " << c << endl; //OK printf( "b points to %d\n", *b); //OK // cout << "b points to " << (*b) << endl; – Not OK: segfaults! return 0; } 如此给出的这个程序产生了你所期望的: c points […]
在C中向结构指针转换NULL有什么好处吗? 例如: typedef struct List { …. } List; List *listPtr = ((List *) NULL) ; PostgreSQL源代码示例: #define NIL ((List *) NULL) http://doxygen.postgresql.org/pg__list_8h_source.html
当我用gcc和g++编译下面的代码时, g++给出错误而不是gcc 。 请注意,代码从int (*)[4]为int (*)[] (指向不完整数组类型的指针)。 int arr[4]; int (*p_arr)[] = &arr; 如不完整数组类型中所述? , C语言允许这种转换。 但是为什么C++不允许这样做并给出错误error: cannot convert ‘int (*)[4]’ to ‘int (*)[]’ in assignment 。 我知道C ++比C更安全类型,但是这个赋值实际上是类型不安全的,因为后来指针的引用(例如sizeof(*p_arr) )无论如何都会在C出错?
如果有人能向我解释以下行为,我将不胜感激: 假设我声明了一个静态2D数组 float buffer[NX][NY]; 现在,如果我想填充这个数组,我注意到它可以这样做: initarray(buffer, NX, NY); #define INITDATAVAL 0.5 void initarray(void *ptr, int nx, int ny) { int i, j; float *data = (float *) ptr; for (i=0; i < nx*ny; i++) { data[i] = INITDATAVAL; } } 我的问题是,如果缓冲区是一个二维数组,一旦传递给initarray函数,它怎么能用作一维数组呢? 我很难理解它…… 当静态分配2D数组时,分配的内存是连续的,但如果动态分配buffer可以使用这种方式吗?
启用-Wsequence-point ,GCC应在发现未定义的行为代码时警告用户。 例如 b = a + ++a; 应该被GCC注意到并且应该被报告为“未定义的行为”代码(因为ISO C没有指定评估操作数的顺序)。 但是,我玩了语法,我尝试了这个: int *a = malloc(sizeof(int) * 2); a[0] = 1; printf(“%d\n”, *(a + (*a)++ – *a)); 当然,我收到了警告 警告:’* a’上的操作可能未定义[-Wsequence-point] 这是我所期望的,因为*a (其为a[0] )的值可以在处理第三个操作数时递增或者可以不递增。 但是,我尝试了以下一个: int *a = malloc(sizeof(int) * 2); a[0] = 1; printf(“%d\n”, *(a + (*a)++ – 1)); 我很惊讶,因为我没有收到任何警告。 这不应该是UB吗? 我的意思是,根据ISO C99,可以在表达式评估期间的任何点评估后增量操作(逗号运算符和三元运算符除外)。 在我的后一个例子中,我没有递增指针,而是指向它指向的整数。 因此,根据标准,它可以在任何点递增(这意味着它可以在评估整个表达式后递增),因此程序可以打印1或2 ,对吧? […]
我在两个代码中做同样的事情。 在代码1中:我使用了char *并在main使用malloc分配空间。 在代码2中:我使用了char数组用于相同的目的。 但为什么输出会有所不同? 代码1: struct node2 { int data; char p[10]; }a,b; main() { a.data = 1; strcpy(ap,”stack”); b = a; printf(“%d %s\n”,b.data,bp); // output 1 stack strcpy(bp,”overflow”); printf(“%d %s\n”,b.data,bp); // output 1 overflow printf(“%d %s\n”,a.data,ap); // output 1 stack } 代码2: struct node1 { int data; char *p; }a,b; main() { a.data […]
如果您执行myarray[ i ]或将myarray[ i ]的地址存储在指针中,是否存在性能差异? 编辑:指针都在我的程序中一个不重要的步骤中计算,其中性能没有标准。 在关键部分期间,指针保持静态并且不被修改。 现在问题是这些静态指针是否比使用myarray[ i ]更快。