赫伯特·希尔特(Herbert Schildt)的书"C完整参考文献"中说"(在有符号的负整数的情况下,右移将导致1被引入,以便保留符号位.)"
保留标志位有什么意义?
此外,我认为这本书是指使用符号位表示负数而不使用二进制补码的情况.但即使在这种情况下,推理似乎也没有任何意义.
我在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)
那么数组声明背后的真相是什么呢?谢谢!
在阅读一本名为"Let us C"的书时,我读到了一个showbit()可以显示数字位的函数.没有提到任何特殊的头文件.在互联网上搜索它并没有发现任何有用的东西.有这样的功能吗?我想要打印十进制数的二进制数.否则请给我一个替换功能.谢谢
我在使用C的嵌入式硬件中遇到过这个.
#define EnterPWDN(clkcon) ( (void (*)(int))0xc0080e0 ) (clkcon)
Run Code Online (Sandbox Code Playgroud)
我不知道这个函数宏是如何工作的.我理解clkcon是EnterPWDN的函数参数,但之后会发生什么?
请帮我理解下面的程序.
#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编程比较陌生,很难理解整个内存分配问题.
让我们说,我这样做:
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个字节被写入内存中尚未正确分配的某个位置.
它只是因为它没有离开堆栈吗?
有人可以指点我到一个可以找到有关那些东西的启示的地方吗?
我想在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语言,并跟随Yashavant P. Kanetkar的"Let Us C".
指针章节中有一行说我们只能比较指向同一数组中元素的指针,即小于(<)和大于(>)指针.
为什么比较任意指针无效?
我想enum在c. 但是,我需要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) 所以这是代码:
#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 版(问题发布时的最新版本),以防您需要参考。