相关疑难解决方法(0)

为什么在C中右移负数会使最左边的位数为1?

赫伯特·希尔特(Herbert Schildt)的书"C完整参考文献"中说"(在有符号的负整数的情况下,右移将导致1被引入,以便保留符号位.)"

保留标志位有什么意义?

此外,我认为这本书是指使用符号位表示负数而不使用二进制补码的情况.但即使在这种情况下,推理似乎也没有任何意义.

c bit-manipulation bit-shift

6
推荐指数
2
解决办法
3万
查看次数

声明具有非常量大小变量的数组

我在C学习我的考试,我正在阅读我从某个网站下载的C摘要.有人写道,不允许写一个变量arr[i]在哪里i.唯一的方法是使用malloc.
但是,我编写了以下代码,它在没有警告的情况下编译,并且在valgrind上没有错误:

int index = 5;
int a4[index];

a4[0] = 1;
a4[1] = 2;

int index2;
scanf("%d",&index2);
int a5[index2];
a5[0] = 1;
a5[1] = 2;
Run Code Online (Sandbox Code Playgroud)

那么数组声明背后的真相是什么呢?谢谢!

c arrays

5
推荐指数
1
解决办法
2449
查看次数

showbits()函数

在阅读一本名为"Let us C"的书时,我读到了一个showbit()可以显示数字位的函数.没有提到任何特殊的头文件.在互联网上搜索它并没有发现任何有用的东西.有这样的功能吗?我想要打印十进制数的二进制数.否则请给我一个替换功能.谢谢

c bits

5
推荐指数
0
解决办法
9302
查看次数

嵌入式C函数宏问题

我在使用C的嵌入式硬件中遇到过这个.

#define EnterPWDN(clkcon) (  (void (*)(int))0xc0080e0 ) (clkcon) 
Run Code Online (Sandbox Code Playgroud)

我不知道这个函数宏是如何工作的.我理解clkcon是EnterPWDN的函数参数,但之后会发生什么?

c embedded macros

5
推荐指数
2
解决办法
871
查看次数

数组衰减成指针

请帮我理解下面的程序.

#include<stdio.h>
int main()
{
    int a[7];
    a[0] = 1976;
    a[1] = 1984;
    printf("memory location of a: %p", a); 
    printf("value at memory location %p is %d", a, *a); 
    printf("value at memory location %p is %d", &a[1], a[1]);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

&a[1]&a+1.它们是相同还是不同?

#include <stdio.h> 
int main() 
{
    int v[10];
    int **p; 
    int *a[5];
    v[0] = 1234;
    v[1] = 5678;
    a[0] = v; 
    a[1] = v+1;
    printf("%d\t%d\t%d\t%d\n", *a[0],*a[1],a[0][0],**a);
    printf("%d\n", sizeof(v));
    return 0;
} 
Run Code Online (Sandbox Code Playgroud)

我想知道*a[5]在记忆中是如何表现的.是*a指向的基指针a[0],a[1],a[2],a[3],a[4] …

c

5
推荐指数
1
解决办法
3329
查看次数

为特定类型分配所需的空间更少?

我对C编程比较陌生,很难理解整个内存分配问题.

让我们说,我这样做:

int *n = malloc(sizeof(char));
// (assuming malloc doesn't return NULL of course)
Run Code Online (Sandbox Code Playgroud)

这提供了指向int的指针,但是我没有为int分配足够的内存.为什么它会起作用呢?我甚至可以明确地将它转换为int,它不会打扰gcc.我知道C编译器非常极简,但即使我为*n赋值,它也不适合char,如:

*n = 300;
Run Code Online (Sandbox Code Playgroud)

......然后打印出来:

printf("%d", *n);
Run Code Online (Sandbox Code Playgroud)

...它工作得非常好,虽然现在最迟我会发现像分段错误这样的错误.

我的意思是,sizeof(char)是1,而sizeof(int)在我的机器上是4.因此,3个字节被写入内存中尚未正确分配的某个位置.

它只是因为它没有离开堆栈吗?

有人可以指点我到一个可以找到有关那些东西的启示的地方吗?

c memory malloc memory-management

5
推荐指数
1
解决办法
86
查看次数

这个使用extern关键字的C程序有什么问题?

我想在main.c中使用来自foo.c的变量a,我写道:

foo.c
#include <stdio.h>

int a[] = {3, 2};

void foo()
{
    printf("foo\taddress of a:%x\n", a);
    printf("foo\tvalue of a[0]:%x\n", a[0]);
}

main.c
#include <stdio.h>

extern int *a;

int main(void)
{
    foo();
    printf("main\taddress of a : %x\n", a);
    printf("main\tvalue of a[0] : %x\n", a[0]);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

和结果输出:

foo address of a:804a014
foo value of a[0]:3
main    address of a : 3
Segmentation fault (core dumped)
Run Code Online (Sandbox Code Playgroud)

为什么?

c

5
推荐指数
1
解决办法
188
查看次数

为什么我们无法比较不指向同一数组中元素的指针?

我一直在学习C语言,并跟随Yashavant P. Kanetkar的"Let Us C".

指针章节中有一行说我们只能比较指向同一数组中元素的指针,即小于(<)和大于(>)指针.

为什么比较任意指针无效?

c arrays pointers pointer-arithmetic

5
推荐指数
2
解决办法
372
查看次数

c 在结构中使用枚举

我想enumc. 但是,我需要enum在另一个内部struct(以避免重复名称)。像这样的东西:

#include <stdio.h>

// define structure as our enum namespace
typedef struct {
    typedef enum {
        Host,
        Cookie,
        Agent
    } Name;
} header_n;

typedef struct {
    header_n::Name key; // using top enum
    char value[128];
} header_t;

int main() {

    header_t header;
    header.key = header_n::Agent;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

事实上,我想使用structfor myenum然后将其enum用作另一个结构中的单独类型,然后将最后一个结构称为完整类型,但我收到以下错误:

error: expected specifier-qualifier-list before 'typedef'
     typedef enum {

error: expected expression before ':' token
     header_n::Name key; …
Run Code Online (Sandbox Code Playgroud)

c enums struct

5
推荐指数
2
解决办法
1万
查看次数

需要帮助来理解我书中的错误示例的含义

所以这是代码:

#include <stdio.h>

int main() {
    char str1[] ="Hello", str2[20] ="Hi";
    char *p ="Hello", *s ="Hi";
    str1 = "Adieu";
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

现在我的书给出了这个原因

error, constant pointer cannot change
Run Code Online (Sandbox Code Playgroud)

当我运行它时,我收到错误:

error: assignment to expression with array type
Run Code Online (Sandbox Code Playgroud)

我的问题是为什么我的书这么说?,指针从哪里来的?

这本书是Yashavant P. Kanetkar 的Let us C 第 18 版(问题发布时的最新版本),以防您需要参考。

c compiler-errors

5
推荐指数
1
解决办法
85
查看次数