查找数据段的地址范围

作为编程练习,我在C中编写了一个标记 – 清除垃圾收集器。我希望扫描数据段(全局等)以获得指定内存的指针,但我不知道如何获取该段的地址。 我怎么能这样做?

为什么char *会导致未定义的行为而char 不会?

尝试修改字符串文字会导致未定义的行为: char * p = “wikipedia”; p[0] = ‘W’; // undefined behaviour 防止这种情况的一种方法是将其定义为数组而不是指针: char p[] = “wikipedia”; p[0] = ‘W’; // ok 为什么char*会导致未定义的行为,而char[]却没有?

为什么我们不能使用双指针来表示二维数组?

为什么我们不能使用双指针来表示二维数组? arr[2][5] = {“hello”,”hai”}; **ptr = arr; 为什么双指针(** ptr)在这个示例中不起作用?

无意中使用=而不是==

看起来 if (x=y) { …. } 代替 if (x==y) { … } 是许多邪恶的根源。 为什么并非所有编译器都将其标记为错误而不是可配置警告? 我有兴趣找出构造if (x=y)有用的情况。

如何在C中打印引号?

在接受采访时我被问到了 使用printf()函数打印引号 我不堪重负。 即使在他们的办公室里也有一台电脑,他们告诉我试一试。 我试过这样的: void main() { printf(“Printing quotation mark ” “); } 但我怀疑它不编译。 当编译器获得第一个”它认为它是字符串的结尾时,它不是。所以我怎么能实现这一点?

未初始化的整数在c中是否始终默认为0?

我正在阅读nginx的源代码并发现它没有初始化许多数值变量,包括ngx_int_t ngx_last_process; ,这里ngx_int_t定义为long int #if 0 ngx_last_process = 0; #endif 那么@Igor Sysoev认为没有必要进行初始化? 但在程序中它假定默认值为0 : for (s = 0; s < ngx_last_process; s++) { if (ngx_processes[s].pid == -1) { break; } } 是否保证未初始化的变量在c中将具有0值?

如何在C中对齐指针

有没有办法在C中对齐指针? 假设我正在将数据写入数组堆栈(因此指针向下),我希望我写的下一个数据是4对齐的,所以数据写入4的倍数的内存位置,我该怎么做那? 我有 uint8_t ary[1024]; ary = ary+1024; ary -= /* … */ 现在假设ary指向位置0x05 。 我希望它指向0x04 。 现在我可以做到 ary -= (ary % 4); 但是C不允许模数指针。 有没有与架构无关的解决方案?

在C中向后读取文本文件

在C中向后读取文件的最佳方法是什么? 我知道一开始你可能会认为这没什么用处,但是大多数日志等都会在文件末尾添加最新的数据。 我想从文件向后读取文本,将其缓冲为行 – 即 ABC 高清 GHI 应该读行ghi , def , abc 。 到目前为止,我尝试过: #include #include void read_file(FILE *fileptr) { char currentchar = ‘\0’; int size = 0; while( currentchar != ‘\n’ ) { currentchar = fgetc(fileptr); printf(“%c\n”, currentchar); fseek(fileptr, -2, SEEK_CUR); if( currentchar == ‘\n’) { fseek(fileptr, -2, SEEK_CUR); break; } else size++; […]

指针的大小可以在数据和函数指针之间变化吗?

我刚刚阅读了C FAQ的指针部分 。 它讨论了无法使用void *指针来保存函数指针,因为指向数据的指针和指向函数的指针在某些平台上可能具有不同的大小,而void *仅保证足够大以容纳指向数据的指针。 任何人都可以给出一个平台的例子,其中指向数据的指针和指向函数的指针实际上有不同的大小?

什么时候使用strdup是个好主意(vs malloc / strcpy)

我可以使用malloc和strcpy来替换它吗? 哪一个更好? 例如: char *s = “Global View”; char *d; d = strdup(s); free(d); 要么 char *s = “Global View”; char *d = malloc(strlen(s) +1); strcpy(d,s); free(d);