考虑一下代码: void foo(char a[]){ a++; // works fine, gets compiled //… } 现在,考虑一下: void foo(){ char a[50]; a++; // Compiler error //… } 我听说一个数组相当于一个常量指针,不能递增,因为它不是一个左值… 那么为什么第一个代码被编译,是这样的,因为函数的数组参数作为指针传递,即T []被转换为T *以传递..所以,foo(a)传递a作为指针。 但它是否再次转换为T [],因为声明为: void foo(char a[]);
这是一个在struct shape , struct rectangle和struct triangle类型的指针之间进行类型转换的程序。 #include #include #include enum { RECTANGLE, TRIANGLE, MAX }; struct shape { int type; }; struct rectangle { int type; int x; int y; }; struct triangle { int type; int x; int y; int z; }; struct shape *get_random_shape() { int type = rand() % MAX; if (type […]
我想知道如何使用函数参数将指针传递给动态分配的数组。 该函数应该分配数组10×10(为简单起见,跳过检查)。 这可能吗? 我究竟做错了什么? 提前致谢。 int array_allocate2DArray ( int **array, unsigned int size_x, unsigned int size_y) { array = malloc (size_x * sizeof(int *)); for (int i = 0; i < size_x; i++) array[i] = malloc(size_y * sizeof(int)); return 0; } int main() { int **array; array_allocate2DArray (*&array, 10, 10); }
在动态内存分配方面,我是新手。 当我们使用void free(void *ptr)释放内存时,内存被释放,但指针的内容不会被删除。 这是为什么? 最新的C编译器有什么区别吗?
这里已经解决了这个问题。 建议的副本和当前给出的答案没有解决为什么首先给出的示例没有问题。 主要是为什么没有推理: “ const int ** is a pointer to const int *它const int ** is a pointer to const int *不同” 也适用于: “ const int * is a pointer to const int它const int * is a pointer to const int只是一个不同的东西” 我从不同的角度接近它,希望得到另一种解释。 带有示例的代码。 #include void f_a (int const a){ /* * Can’t do: * […]
qsort(bt->rw[t], bt->num[t], sizeof(TRELLIS_ATOM *), (int (*)(const void *,const void *))compare_wid); bt->rw[t]是一个指向struct指针的指针, bt->[num]是一个int ,我不明白第四个参数是什么,除了compare_wid是在某处定义的函数,如下所示: static int compare_wid( TRELLIS_ATOM* a, TRELLIS_ATOM* b ) { … return x; }
我有以下C代码部分: char c; int n = 0; while ( (c = getchar()) != EOF ){ if (c == “\n”){ n++; } } 在编译期间,编译器告诉我 warning: comparison between pointer and integer [enabled by default] 问题是,如果用’\ n’替换“\ n”,根本就没有警告任何人都可以解释原因。 另一个奇怪的事情是我根本不使用指针。 我知道以下问题 警告:c中指针与整数[默认启用]之间的比较 警告:C中指针和整数之间的比较 但在我看来,他们与我的问题无关 PS。 如果不是char c; 会有int c; 还会有警告
我在生成int矩阵时遇到了一些问题而没有产生内存泄漏。 我希望能够通过read_matrix()动态地将给定(全局)矩阵制作成任意大小。 但后来我希望能够在以后释放内存。 所以在我的main方法中,第二个printf应该导致总线错误,因为它不应该分配任何内存。 我将如何创建这个? int** first_matrix; int** second_matrix; int** result_matrix; int** read_matrix(int size_x, int size_y) { int** matrix; matrix = calloc(size_x, sizeof(int*)); for(int i = 0;i<size_x;i++) { matrix[i] = calloc(size_y, sizeof(int)); } for(int i = 0;i<size_x;i++) { for(int j = 0;j<size_y;j++) { matrix[i][j] = i*10+j; } } return matrix; } int main(int stackc, char** […]
为什么不能取位域的地址? 如何制作指向位字段的指针? 这是代码…… struct bitfield { unsigned int a: 1; unsigned int b: 1; unsigned int c: 1; unsigned int d: 1; }; int main(void) { struct bitfield pipe = { .a = 1, .b = 0, .c = 0, .d = 0 }; printf(“%d %d %d %d\n”, pipe.a, pipe.b, pipe.c, pipe.d); printf(“%p\n”, &pipe.a); /* […]
我有两个指针, char *str1; int *str2; 如果我看一下两个指针的大小,我们假设 str1=4 bytes str2=4 bytes str1 ++将增加1个字节,但如果str2 ++它将增加4个字节。 这背后的概念是什么?