当我发现它仅适用于Linux时,我正在研究Valgrind以帮助改进我的C编码/调试 - 我没有其他需要或兴趣将我的操作系统转移到Linux所以我想知道是否有一个同样好的Windows程序.
当我尝试编译使用gets()GCC函数的C代码时,
我明白了
警告:
(.text + 0x34):警告:`gets'函数很危险,不应该使用.
我记得这与堆栈保护和安全性有关,但我不确定为什么?
有人可以帮我删除这个警告并解释为什么会有这样的使用警告gets()?
如果gets()是如此危险,为什么我们不能删除它?
我试图从用户那里获取一些数据并将其发送到gcc中的另一个函数.代码是这样的.
printf("Enter your Name: ");
if (!(fgets(Name, sizeof Name, stdin) != NULL)) {
fprintf(stderr, "Error reading Name.\n");
exit(1);
}
Run Code Online (Sandbox Code Playgroud)
但是,我发现它最后有一个换行符\n.所以,如果我输入John它最终发送John\n.如何删除它\n并发送正确的字符串.
打电话的时候execl(...),我得到一个errno=2.这是什么意思?我怎么知道这个的含义errno?
任何人都可以用简单的英语有关之间的差异说明printf, fprintf以及sprintf结合实例?
它是什么流?
在阅读"C中的文件处理"时,我对其中的三个感到困惑.
我一直在阅读div和mul组装操作,我决定通过在C中编写一个简单的程序来实现它们:
#include <stdlib.h>
#include <stdio.h>
int main()
{
size_t i = 9;
size_t j = i / 5;
printf("%zu\n",j);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
然后生成汇编语言代码:
gcc -S division.c -O0 -masm=intel
Run Code Online (Sandbox Code Playgroud)
但是看生成的division.s文件,它不包含任何div操作!相反,它通过位移和魔术数字来做某种黑魔法.这是一个计算代码片段i/5:
mov rax, QWORD PTR [rbp-16] ; Move i (=9) to RAX
movabs rdx, -3689348814741910323 ; Move some magic number to RDX (?)
mul rdx ; Multiply 9 by magic number
mov rax, rdx ; Take only the upper 64 bits of the …Run Code Online (Sandbox Code Playgroud) 通过一个小错字,我意外地发现了这个结构:
int main(void) {
char foo = 'c';
switch(foo)
{
printf("Cant Touch This\n"); // This line is Unreachable
case 'a': printf("A\n"); break;
case 'b': printf("B\n"); break;
case 'c': printf("C\n"); break;
case 'd': printf("D\n"); break;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
似乎声明printf的顶部switch是有效的,但也完全无法访问.
我得到了一个干净的编译,甚至没有关于无法访问的代码的警告,但这似乎毫无意义.
编译器是否应将此标记为无法访问的代码?
这有什么用途吗?
什么之间的区别__PRETTY_FUNCTION__,__FUNCTION__,__func__,和他们在哪里记录?我如何决定使用哪一个?
我试图理解C中的指针,但我目前对以下内容感到困惑:
char *p = "hello"
Run Code Online (Sandbox Code Playgroud)
这是一个指向字符数组的char指针,从h开始.
char p[] = "hello"
Run Code Online (Sandbox Code Playgroud)
这是一个存储hello的数组.
将这两个变量都传递给这个函数有什么区别?
void printSomething(char *p)
{
printf("p: %s",p);
}
Run Code Online (Sandbox Code Playgroud) 在有关C的信誉良好的来源中,在讨论了&运营商之后给出了以下信息:
...有点不幸的是,术语[地址]仍然存在,因为它混淆了那些不知道地址是什么的人,并误导那些做的人:把指针当作地址通常会导致悲伤...... .
我读过的其他材料(来自同等声誉的来源,我会说)总是毫不掩饰地将指针和&操作符称为给出内存地址.我很想继续寻找事情的实际情况,但是当信誉良好的消息来源不同意时,这很难.
现在我有点困惑 - 究竟什么是指针,那么,如果不是内存地址?
PS
作者后来说:......我将继续使用"地址"一词,因为发明一个不同的 [术语] 会更糟.