是否允许编译器回收释放的指针变量?

有人声称 编译器可以自由地将指针变量重用于其他目的之后 realloc 被释放 ,所以你不能保证它具有与之前相同的价值 即 void *p = malloc(42); uintptr_t address = (uintptr_t)p; free(p); // […] stuff unrelated to p or address assert((uintptr_t)p == address); 可能会失败。 C11附件J.2读 使用指向通过调用free或realloc函数释放的空间的指针的值(7.22.3)[ 未定义 ] 但附件当然不是规范性的。 附件L.3(规范性的,但可选的)告诉我们,如果 引用通过调用free或realloc函数释放的空间的指针值(7.22.3)。 结果被允许是关键的未定义行为。 这证实了这一说法,但我希望从标准本身而不是附件中看到适当的引用。

如何从c中的字符串中提取数字?

假设我有一个像ab234cid*(s349*(20kd的字符串ab234cid*(s349*(20kd ,我想提取所有数字ab234cid*(s349*(20kd ,我该怎么办?

使用指针修改字符串时发生分段错误?

上下文 我正在学习C,我正在尝试使用指针来反转字符串。 (我知道你可以使用一个数组;这更多的是学习指针。) 问题 尝试运行下面的代码时,我不断遇到分段错误。 GCC似乎不喜欢*end = *begin; 线。 这是为什么? 特别是因为我的代码几乎与另一个问题中讨论的非邪恶C函数相同 #include #include void my_strrev(char* begin){ char temp; char* end; end = begin + strlen(begin) – 1; while(end>begin){ temp = *end; *end = *begin; *begin = temp; end–; begin++; } } main(){ char *string = “foobar”; my_strrev(string); printf(“%s”, string); }

从char **隐式转换为const char **

为什么我的编译器(GCC)没有从char**隐式转换为const char** ? 以下代码: #include void print(const char** thing) { std::cout << thing[0] << std::endl; } int main(int argc, char** argv) { print(argv); } 给出以下错误: oi.cpp: In function ‘int main(int, char**)’: oi.cpp:8:12: error: invalid conversion from ‘char**’ to ‘const char**’ [-fpermissive] oi.cpp:3:6: error: initializing argument 1 of ‘void print(const char**)’ [-fpermissive]

如何与GCC进行弱连接工作?

似乎有3种方式告诉GCC弱连接符号: __attribute__((weak_import)) __attribute__((weak)) #pragma weak symbol_name 这些都不适合我: #pragma weak asdf extern void asdf(void) __attribute__((weak_import, weak)); … { if(asdf != NULL) asdf(); } 我总是得到这样的链接错误: 未定义的符号: “_asdf”,引自: _asdf $ non_lazy_ptr在ccFA05kN.o中 ld:找不到符号 collect2:ld返回1退出状态 我在OS X 10.5.5上使用GCC 4.0.1。 我究竟做错了什么?

如何可靠地获得C型arrays的大小?

如何可靠地获得C风格数组的大小? 通常建议的方法似乎是使用sizeof ,但它在foo函数中不起作用,其中x被传入: #include void foo(int x[]) { std::cerr << (sizeof(x) / sizeof(int)); // 2 } int main(){ int x[] = {1,2,3,4,5}; std::cerr << (sizeof(x) / sizeof(int)); // 5 foo(x); return 0; } 这个问题的答案推荐sizeof但他们并没有说它(显然?)如果你传递数组不起作用。 那么,我是否必须使用哨兵? (我不认为我的foo函数的用户总是可以信任最后放一个标记。当然,我可以使用std::vector ,但是我没有得到漂亮的速记语法{1,2,3,4,5} 。)

只有当参数不是常量时,math.h中的sqrt才会导致链接器错误“未定义对sqrt的引用”

我创建了一个小程序,如下所示: #include #include #include int main(int argc, char *argv[]) { int i; double tmp; double xx; for(i = 1; i <= 30; i++) { xx = (double) i + 0.01; tmp = sqrt(xx); printf("the square root of %0.4f is %0.4f\n", xx,tmp); sleep(1); xx = 0; } return 0; } 当我尝试使用以下命令编译它时,我收到编译器错误。 gcc -Wall calc.c -o calc […]

创建没有窗口的应用程序

如何编写可以在不打开窗口或控制台的情况下运行的C / C ++应用程序?

比较unsigned char和EOF

当编译以下代码时,它进入无限循环: int main() { unsigned char ch; FILE *fp; fp = fopen(“abc”,”r”); if(fp==NULL) { printf(“Unable to Open”); exit(1); } while((ch = fgetc(fp))!=EOF) printf(“%c”,ch); fclose(fp); printf(“\n”,ch); return 0; } gcc编译器也会在编译时发出警告 abc.c:13:warning: comparison is always true due to limited range of data type 当unsigned char被char或int替换时,代码运行正常,即它终止。 但代码也适用于unsigned int 。 因为我已经读过EOF在stdio.h定义为-1然后为什么这个代码对unsigned char失败但是对unsigned int运行正常。

如何使用scanf()扫描包含空格的字符串?

我想编写一个子程序,用户可以在其中输入注释。 我使用scanf(“%s”, X)并让它们输入注释,但它只能将字存储在字符串中的空格键之前。 如何将整个句子存储到字符串或文件中来解决此问题? 我的代码如下: FILE *fp; char comment[100]; fp=fopen(“comment.txt”,”a”); printf(“You can input your comment to our system or give opinion to the musics :\n”); scanf(“%s”,comment); fputs(comment,fp);