小编Reg*_*ser的帖子

什么是char i = 0x80以及为什么在位移时没有发生溢出

这是一个程序

#include <stdio.h>
main()
{ unsigned char i=0x80;
printf("i=%d",i<<1);
}
Run Code Online (Sandbox Code Playgroud)

它给出的输出是256.我不清楚它是什么

unsigned char i=0x80; <-- i is not int it is char so what will it store?
Run Code Online (Sandbox Code Playgroud)

我知道bitshift和十六进制的东西.如何存储i的值以及如何将其更改为256?

UPDATE

为什么在位移操作发生时没有发生溢出?

c

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

什么是in_addr_t inet_ntoa等类型的地址

在发布此问题之前我已经检查了线程in_addr_t中的线程

我的问题不同.

我知道inet_ntoa函数属于以下类型

char * inet_ntoa (struct in_addr in);
Run Code Online (Sandbox Code Playgroud)

我想知道的是什么 in_addr_t

在套接字程序中使用它时的表示形式.

我检查了结构定义 <netinet/in.h>

   typedef uint32_t in_addr_t;

   struct in_addr {
       in_addr_t s_addr;
   };
Run Code Online (Sandbox Code Playgroud)

属于上述类型.我不想像inet_ntoa那样将in_addr_t打印到char*.我想看看in_addr_t是什么.它是如何完成的,或者究竟是什么in_addr_t以及为什么它在套接字编程中一次又一次地使用.如果我没有弄错,它被定义为

typedef uint32_t in_addr_t;

所以,如果in_addr_tunsigned 32 bitint我想看看是什么,而不是char *在stdout上打印192.168.1.1类型的输出.

c sockets network-programming in-addr

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

如何将值传递给整数指针

#include<stdio.h>

int main ()
{
    int *ip;
    printf("Enter a no \n");
    scanf("%d",ip);
    printf("ip=%d",*ip);
}
Run Code Online (Sandbox Code Playgroud)

以上是我的程序,当我运行它时输出

./a.out 
Enter a no 
10
Segmentation fault
Run Code Online (Sandbox Code Playgroud)

我在gdb第6行检查了问题是什么

scanf("%d",ip);

所以我推断这ip是一个指向整数的指针并%d期望一个地址值.虽然我试图将一个整数传递给指定的值,ip所以我认为这是错误的.但在上述情况下,正确的做法是什么.我想使用扫描并为指向的地址分配一个整数值ip(在我的情况下,这是丢失的).

c

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

为什么以下计划有效

我写了以下程序

#include<stdio.h>
 main ()
{
        extern int i;
        printf("\n%d",i);
}
int i=30;
Run Code Online (Sandbox Code Playgroud)

我期待一个错误消息,因为我在main之后初始化,但相反程序给了我输出.为什么它没有给我一个错误是我想知道的.

c extern

7
推荐指数
2
解决办法
363
查看次数

如果有条件,请在C示例中提出一本棘手问题的书

可能重复:
','运算符在C中做什么?

好的我今天接受了采访,他们问我下面代码的输出应该是什么

#include<stdio.h>

int main ()
{

int a=1,b=1;
char c='0';
if(a,b,c)
   printf("wow \n");
}
Run Code Online (Sandbox Code Playgroud)

在我的机器上运行后,我能够得到答案,但我无法回答那里.我想知道是否允许这样的if语句?在哪里提到的?

我的问题是上面提到的if条件我无法理解if语句是如何工作的.

**更新**
我没有在K&R中找到任何这样的东西,任何人都可以推荐一本好书.我已经编程了一些东西而不是C的新东西,但是在这个问题失败之后我想再看一下如果有更深入的C概念了(特别是如上所述)提到我在哪里可以阅读.

c comma-operator

7
推荐指数
1
解决办法
1362
查看次数

fgets内部如何运作?

嗯,这是一个基本问题,但我似乎很困惑.

#include<stdio.h>
int main()
{
char a[100];
printf("Enter a string\n");
scanf("%s",a);
}
Run Code Online (Sandbox Code Playgroud)

基本上上面就是我想要实现的目标.如果我输入一个字符串

James Bond
Run Code Online (Sandbox Code Playgroud)

然后我想将它存储在数组a中.但问题是因为只存在James字之间存在空格.那么我该如何解决这个问题呢?

更新
在下面给出的回复之后,我理解fgets()将是更好的选择.我想知道fgets的内部工作,为什么它能够存储带有空格的字符串,而scanf不能这样做.

c string gcc

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

如何将非原子操作转换为原子操作

我正在尝试理解原子和非原子操作.关于操作系统以及关于C.根据维基百科页面这里

考虑一个简单的计数器,不同的进程可以递增
非原子

天真的非原子实现:
读取内存位置的值;
在值上加一个;
将新值写回内存位置.

现在,想象两个进程正在运行递增单个共享内存位置:
第一个进程读取内存位置中的值;
第一个进程为值添加一个;
但是在它可以将新值写回内存位置之前它被暂停,并允许第二个进程运行:
第二个进程读取内存位置的值,与第一个进程读取的值相同;
第二个过程为值添加一个;
第二个进程将新值写入内存位置.

如何将上述操作作为一种毒性操作.我对原子操作的理解是任何不间断执行的东西都是原子的.所以举个例子

int b=1000;
  b+=1000;
Run Code Online (Sandbox Code Playgroud)

根据我的理解应该是一个原子操作,因为两个指令都是在没有中断的情况下执行的,我从某个人那里学到了在C中没有任何已知的原子操作,因此上面两个语句都是非原子的.所以我想要理解的是,当涉及到编程语言而不是操作系统时,原子性是什么?

c operating-system atomicity

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

struct sched_domain在include/linux/sched.h中的含义(在内核中调度域)

我试图了解负载均衡器如何在Linux内核中的多处理器系统上运行,

Linux调度程序基本上使用runques来存储它必须在下一次运行的任务,现在以执行load_balancer()的方式处理多处理器系统的情况,如Robert Loves书中给出的解释Linux内核开发第2版正在关注

首先,load_balance()调用find_busiest_queue()来确定最繁忙的runqueue.换句话说,这是其中包含最多进程的runqueue.如果没有比当前进程多25%或更多进程的runqueue,则find_busiest_queue()返回NULL并返回load_balance().否则,返回最繁忙的runqueue.

其次,load_balance()决定它想从中拉出的最繁忙的runqueue上的哪个优先级数组.过期的阵列是首选,因为这些任务在相对较长的时间内没有运行,因此很可能不在处理器的缓存中(即,它们不是缓存热点).如果过期的优先级数组为空,则活动的数组是唯一的选择.

接下来,load_balance()查找具有任务的最高优先级(最小值)列表,因为公平分配高优先级任务比低优先级任务更重要.

分析给定优先级的每个任务,以查找未运行的任务,不阻止通过处理器关联迁移,而不是缓存热.如果任务满足此条件,则调用pull_task()将任务从最繁忙的runqueue拉到当前的runqueue.

只要运行队列保持不平衡,就会重复前两个步骤,并将更多任务从最繁忙的队列中拉到当前.最后,当解决不平衡时,当前的runqueue被解锁并且load_balance()返回.

代码如下

static int load_balance(int this_cpu, runqueue_t *this_rq,
                        struct sched_domain *sd, enum idle_type idle)
{
        struct sched_group *group;
        runqueue_t *busiest;
        unsigned long imbalance;
        int nr_moved;

        spin_lock(&this_rq->lock);

        group = find_busiest_group(sd, this_cpu, &imbalance, idle);
        if (!group)
                goto out_balanced;

        busiest = find_busiest_queue(group);
        if (!busiest)
                goto out_balanced;

        nr_moved = 0;
        if (busiest->nr_running > 1) {
                double_lock_balance(this_rq, busiest);
                nr_moved = move_tasks(this_rq, this_cpu, busiest,
                                      imbalance, sd, idle);
                spin_unlock(&busiest->lock);
        }
        spin_unlock(&this_rq->lock);

        if (!nr_moved) {
                sd->nr_balance_failed++;

                if (unlikely(sd->nr_balance_failed > sd->cache_nice_tries+2)) { …
Run Code Online (Sandbox Code Playgroud)

c kernel processor intel scheduler

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

以下程序如何处理指针操作

可能重复:
来自GATE论文的c程序

这是一个正在运行的程序

#include<stdio.h>
int main ()
{
char c[]="GATE2011";
char *p=c;
printf("%s",p+p[3]-p[1]);
}
Run Code Online (Sandbox Code Playgroud)

输出是

2011
Run Code Online (Sandbox Code Playgroud)

现在问题是我无法理解p + p [3] -p [1]的操作是什么指向的?

我的理解是当我宣布某些事情时

char c[]="GATE2011"
Run Code Online (Sandbox Code Playgroud)

然后c是指向字符串常量的指针,字符串以G开头.在下一行中*p=c; ,指针p指向c指向的相同地址.那么上面的算法如何工作呢?

c string pointers

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

如何知道没有sizeof的int的大小

可能重复:
不使用sizeof的数据类型的大小

这是在C采访中提出的问题我想知道这是什么正确的逻辑

如果您没有C语言中的sizeof运算符,您将如何知道int的大小?

c

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