标签: c

有一个很好的Valgrind替代Windows吗?

当我发现它仅适用于Linux时,我正在研究Valgrind以帮助改进我的C编码/调试 - 我没有其他需要或兴趣将我的操作系统转移到Linux所以我想知道是否有一个同样好的Windows程序.

c windows debugging valgrind memory-leaks

210
推荐指数
12
解决办法
30万
查看次数

为什么获取功能如此危险以至于不应该使用它?

当我尝试编译使用gets()GCC函数的C代码时,

我明白了

警告:

(.text + 0x34):警告:`gets'函数很危险,不应该使用.

我记得这与堆栈保护和安全性有关,但我不确定为什么?

有人可以帮我删除这个警告并解释为什么会有这样的使用警告gets()

如果gets()是如此危险,为什么我们不能删除它?

c gets fgets buffer-overflow

210
推荐指数
9
解决办法
14万
查看次数

从fgets()输入中删除尾随换行符

我试图从用户那里获取一些数据并将其发送到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并发送正确的字符串.

c string gcc newline fgets

210
推荐指数
5
解决办法
30万
查看次数

如何知道'errno'是什么意思?

打电话的时候execl(...),我得到一个errno=2.这是什么意思?我怎么知道这个的含义errno

c linux errno

208
推荐指数
9
解决办法
31万
查看次数

fprintf,printf和sprintf之间的区别?

任何人都可以用简单的英语有关之间的差异说明printf, fprintf以及sprintf结合实例?

它是什么流?

在阅读"C中的文件处理"时,我对其中的三个感到困惑.

c io printf stream

206
推荐指数
4
解决办法
20万
查看次数

为什么GCC在实现整数除法时使用乘以奇数的乘法?

我一直在阅读divmul组装操作,我决定通过在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)

c assembly gcc x86-64 integer-division

206
推荐指数
4
解决办法
1万
查看次数

在switch-case中有效但无价值的语法?

通过一个小错字,我意外地发现了这个结构:

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是有效的,但也完全无法访问.

我得到了一个干净的编译,甚至没有关于无法访问的代码的警告,但这似乎毫无意义.

编译器是否应将此标记为无法访问的代码?
这有什么用途吗?

c switch-statement language-lawyer

206
推荐指数
8
解决办法
1万
查看次数

__PRETTY_FUNCTION __,__ FUNCTION __,__ func__之间有什么区别?

什么之间的区别__PRETTY_FUNCTION__,__FUNCTION__,__func__,和他们在哪里记录?我如何决定使用哪一个?

c c++ compiler-construction standards

205
推荐指数
5
解决办法
10万
查看次数

C中的char数组与char指针有什么区别?

我试图理解C中的指针,但我目前对以下内容感到困惑:

将这两个变量都传递给这个函数有什么区别?

void printSomething(char *p)
{
    printf("p: %s",p);
}
Run Code Online (Sandbox Code Playgroud)

c arrays pointers

205
推荐指数
6
解决办法
33万
查看次数

如果不是内存地址,究竟什么是C指针?

在有关C的信誉良好的来源中,在讨论了&运营商之后给出了以下信息:

...有点不幸的是,术语[地址]仍然存在,因为它混淆了那些不知道地址是什么的人,并误导那些做的人:把指针当作地址通常会导致悲伤...... .

我读过的其他材料(来自同等声誉的来源,我会说)总是毫不掩饰地将指针和&操作符称为给出内存地址.我很想继续寻找事情的实际情况,但是当信誉良好的消息来源不同意时,这很难.

现在我有点困惑 - 究竟什么是指针,那么,如果不是内存地址?

PS

作者后来说:......我将继续使用"地址"一词,因为发明一个不同的 [术语] 会更糟.

c pointers memory-address

205
推荐指数
13
解决办法
3万
查看次数