学习并弄乱了函数指针,我注意到了一种初始化void函数指针并转换它们的方法。 然而,虽然我没有收到任何警告或错误,无论是使用GCC还是VS的编译器,我都想知道这样做是危险的还是坏的做法,因为我没有看到这种方法经常初始化函数指针互联网。 而且,我们称之为通用函数指针吗? #include #include #include #define PAUSE (_getch()) uint16_t add(const uint16_t x, const uint16_t y) { return x + y; } char chr(uint8_t test) { return (char)test; } int main(void) { void(*test)() = (void*)add; const uint16_t x = 1, y = 1; uint16_t value = ((uint16_t(*)())test)(x, y); test = (void*)chr; printf(“%d\n”, add(x, y)); // […]
我有一个函数,它接受一个指向char **的指针并用字符串填充它(我想是一个字符串数组)。 * list_of_strings *在函数内部分配内存。 char * *list_of_strings = NULL; /* list_of_strings malloc’d inside function */ fill_strings_with_stuff(&list_of strings); use_list_for_something(list_of_strings); /* Now how do I free it all? */ 在使用弦乐后,我将如何释放内存? 如果我打电话 free(list_of_strings); 不会只是释放实际的指针而不是每个字符串本身使用的内存吗? 我如何完全释放内存 为了清楚起见,该函数看起来像这样: fill_strings_with_stuff(char *** list) { *list = malloc(AMOUNT); for (i = 0; i < SOMETHING; i++) { *(list + i) = malloc(LINE_LEN); […]
我正在学习大学课程中的C和指针,我认为除了多维数组和指针之间的相似性之外,我对这个概念有很好的把握。 我认为,因为所有数组(甚至是多维数组)都存储在连续的内存中,你可以安全地将它转换为int* (假设给定的数组是一个int[] 。)但是,我的教授说明星中的星数。定义取决于数组中的维数。 因此, int[]将成为int* , int[][]将成为int**等。 所以我写了一个小程序来测试这个: void foo(int** ptr) { } void bar(int* ptr) { } int main() { int arr[3][4]; foo(arr); bar(arr); } 令我惊讶的是,编译器在两个函数调用上发出警告。 main.c:22:9: warning: incompatible pointer types passing ‘int [3][4]’ to parameter of type ‘int **’ [-Wincompatible-pointer-types] foo(arr); ^~~ main.c:8:16: note: passing argument to parameter ‘ptr’ here void foo(int** […]
我遇到了一些我正在编写的低级代码的问题,我需要将对象用作volatile,但不一定是因为我希望将类型声明为volatile(出于可重用性的原因)。 但是,我可以定义指向结构的限定变体的指针,如以下段中所述。 struct x { int bar; }; struct x foobar; … volatile struct x *foo = &foobar; 现在foo实际上是指向该类型对象的指针: volatile struct x { volatile int x; }; 因为volatile适用于所有struct成员。 现在我的问题是当一个对象包含指向另一个对象的指针时,如何应用波动性? struct x { struct y *bar; }; 指向x的易变实例然后将其视为: volatile struct x { struct y * volatile bar; }; 或作为: volatile struct x { volatile struct y […]
我试图实现缓冲区溢出攻击,我需要知道我试图溢出的缓冲区的地址。 使用GDB显示的地址与我在代码中执行此操作时的地址不同: 确切代码: #include int main() { char buffer[20]; printf(“%p\n”, buffer); // 0xbffff320 return 0; } 但是,如果我这样做在gdb中: p &buffer 我得到: 0xbffff330 为什么会有差异,它会搞砸我的缓冲区溢出攻击? 我禁用了ALSR和堆栈防护。 谢谢。 编辑1:即使我单步执行gdb并遇到打印行,我也会得到0xbffff320作为地址 编辑2: 环境:在Windows 7上的虚拟框中运行Ubuntu Linux 9映像。 gdb版本:6.8-debian 使用GCC编译,如: gcc -g -fno-stack-protector filename.c立即执行: ./a.out地址打印:0xbffff320 然后在调试器中打开如下: gdb ./a.out然后输入b main然后run p &buffer 然后地址是0xbffff330 编辑3: 这是重现行为的gdb日志: $ gdb ./a.out b主要 跑 这里的p&buffer / *地址与我运行的可执行文件时显示的不同* / […]
关于字符指针以及它们是如何工作的我不太清楚。 该程序构建,但运行时崩溃。 char *ab = NULL; //ab = “abc123”; // works fine sprintf(ab, “abc%d”, 123); // this line seems to crash the program 当sprintf接受(char * str)作为第一个参数时,我不明白这是怎么回事。 有人可以向我解释一下吗?
#include #include void foo(int *a, int *b); void foo(int *a, int *b) { *a = 5; *b = 6; a = b; } int main(void) { int a, b; foo(&a, &b); printf(“%d, %d”, a, b); return 0; } 为什么a = b(foo)不起作用? printf输出“5,6”谢谢。
如何在C中声明指向字符数组的指针?
我对如何在头文件中声明函数指针感到困惑。 我想在main和一个名为menus.c的文件中使用它,并在menus.h中声明它。我假设。 我们想要初始化以指向某个function。 它看起来像这样: void (*current_menu)(int); 我们在menus.c,menus.h和main中写了什么?
你更喜欢在代码中看到类似t_byte* (带有typedef unsigned char t_byte )或unsigned char*的东西吗? 我倾向于在我自己的图书馆中使用t_byte ,但从未参与过这种方法的大型项目,我对这些陷阱感到疑惑。