小编Ani*_*amy的帖子

C函数参数char*vs char []

我认为这个问题是这个SO答案的延伸.说我有以下代码:

#include <stdio.h>
#include <string.h>

void func(char *str)
{
    strcpy(str, "Test");
}

int main()
{
    char testStr[20] = "Original";
    func(testStr);
    printf("%s\n", testStr);  /* Prints "Test" followed by a new-line */
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

根据我的理解,不应该func期望指向只读文字的指针作为参数?然而,传递的是只读文字堆栈上的副本.

即使这会产生正确的结果,这样做是否100%正确?难道提高代码的可读性,如果func()接受char [],而不是char *

c arguments function

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

使用popen和pclose时的问题

我有一个使用popen和的程序pclose:

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/wait.h>
int main(void)
{
    FILE *fp = NULL;
    int ret_val = 0;

    fp = popen("ls *", "r");
    if (NULL == fp)
    {
        printf("popen error\n");
        return 1;
    }

    ret_val = pclose(fp);
    if (-1 == ret_val)
    {
        printf("pclose error\n");
        return 1;
    }
    else
    {
        printf("%d,%d,%d\n",ret_val, WIFEXITED(ret_val), WEXITSTATUS(ret_val));
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

该计划的输出是:

./test
Broken Pipe
36096,1,141
Run Code Online (Sandbox Code Playgroud)

我的问题是:

  1. 为什么会出现"破管"?
  2. 为什么退出状态码为141?我认为"ls*"执行成功,因此退出状态应为0.

c unix shell

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

当其中一个字段是数组时,如何初始化结构的所有字段?

#include <stdio.h>

typedef struct
{
    int as;
    int bs;
    int cs;
}asd_t;

typedef struct
{
    asd_t asd[10];
}asd_field_t;    

typedef struct
{
    int a;
    int b;
    asd_field_t  asd_field[10];
}abc_t;    

int main()
{
    abc_t abc ={0,1,{0}};
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,我试图初始化结构abc_t.将上面的代码编译为:

gcc -Wall sample.c
Run Code Online (Sandbox Code Playgroud)

给我:

sample.c: In function 'main':
sample.c:26: warning: missing braces around initializer
sample.c:26: warning: (near initialization for 'abc.asd_field[0].asd')
Run Code Online (Sandbox Code Playgroud)

我该如何避免这种警告?

c gcc-warning data-structures

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

如何在cpufreq.c文件中扩展"for_each_possible_cpu"?

我正在浏览driver/cpufreq/cpufreq.c以了解它是如何工作的.我遇到了一段我无法理解的代码.

cpufreq_core_init:

for_each_possible_cpu(cpu) {
        per_cpu(cpufreq_policy_cpu, cpu) = -1;
        init_rwsem(&per_cpu(cpu_policy_rwsem, cpu));
}
Run Code Online (Sandbox Code Playgroud)

当我浏览定义的宏时,

#define for_each_possible_cpu(cpu) for_each_cpu((cpu), cpu_possible_mask)

#define per_cpu(var, cpu) \
        (*SHIFT_PERCPU_PTR(&(var), per_cpu_offset(cpu)))

#define init_rwsem(sem)                                         \
do {                                                            \
        static struct lock_class_key __key;                     \
                                                                \
        __init_rwsem((sem), #sem, &__key);                      \
} while (0)
Run Code Online (Sandbox Code Playgroud)

我的问题:

  1. 如何for_each_possible_cpu扩展?
  2. 为什么还有两个人#defines在里面打电话?
  3. 为什么per_cpu输出等于-1?

c linux-device-driver linux-kernel

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

为什么这个程序会导致溢出?

#include <stdio.h>
int main(void)
{
    char test = 0x80;
    printf("%c\n", test);  /* To remove the "unused" warning */
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我知道一个字符保证是一个字节.0x80也是一个字节.那么为什么我会收到以下错误/警告?

错误:隐式常量转换溢出[-Werror = overflow]

在我的情况下,这是一个错误,因为我将警告视为错误.

0x80是出现此警告/错误的最小值.如果我将其更改为0x7F,则编译正常.我使用ideone.com和'C99 strict'选项来编译代码.据报道使用gcc-4.7.2.

c

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

为旧系统编写一个相对较大的线程应用程序

今天我的老板和我正在讨论我写的一些代码.我的代码从给定的HTTP/HTTPS链接下载3个文件.我有多线程下载,以便所有3个文件同时下载3个独立的线程.在这次讨论中,我的老板告诉我,代码将被发送给最有可能运行旧硬件和软件的人(我说的是Windows 2000).

在此之前,我从未考虑过线程应用程序如何在旧硬件上扩展.我意识到,如果CPU只有1个内核,则线程无用,甚至可能会使性能恶化.我一直在想这个下载任务是否是I/O操作.这意味着,如果API被阻止等待来自HTTP/HTTPS服务器的信息,是否会同时安排另一个想要进行计算的线程?旧的操作系统会进行此类调度吗?

他说的另一件事是:由于代码将在旧机器上运行,我的应用程序不应该吃CPU.他说Sleep()在CPU密集型任务之后使用调用来允许其他程序有一些喘息空间.现在我总是觉得Sleep()在任何程序中使用都很糟糕.我错了吗?何时使用Sleep()合理?

谢谢你的期待!

c windows multithreading

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

char*[]和char(*)[]之间的区别

有什么区别

char *array[10];

char (*array)[10];

据我了解,

  • 情况1:
    • array 声明为大小为10的字符数组数组.
    • 这是因为[]优先级高于*.
  • 案例2:
    • array 声明为指向大小为10的字符数组的指针.
    • 这是因为()并且[]具有相同的优先级,并且它们从左到右进行评估.然后*评估操作员.

我的理解是否正确?即使它是正确的,我也会感到非常困惑.有人可以更清楚地解释一下这个区别吗?

c arrays pointers char

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

如何知道程序中每个变量的地址,指针,函数,函数的返回地址等?

我想检查我的代码的每一行的地址.我想知道:

  • 创建变量时,在哪个地址?
  • 创建函数时,在哪个地址?
  • 当一个函数返回时,那么在什么地址?

我在这里想做什么?使用dumpbin获取信息.

我期待什么?

fun main add:0x0000
var int i add:0x2496
var int j add:0x249A
Run Code Online (Sandbox Code Playgroud)

非常感谢正确解释的适当帮助.

c memory-address

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

是否可以在CEdit控件的数字输入和字母数字输入模式之间切换?

我有一些单选按钮,决​​定了给CEdit控件的输入类型.按照设计,我的CEdit控件接受数字和字符.

有没有办法在用户点击提供的单选按钮时才将此输入限制为仅限数字?此外,当用户点击另一个选项(即字母数字模式)时,是否可以切换回来?

我设置我的CEdit控件以使用Visual C++的GUI接受字母数字字符(即右键单击控件 - >属性 - >"样式"选项卡 - >选择"数字").

一个用例示例:

  1. 用户开始申请.
  2. 用户点击某个按钮,此对话框与CEdit控件一起考虑显示.
  3. 向用户显示单选按钮,默认情况下选择字母数字按钮(因为这是在设计时设置的默认模式).
  4. 用户点击数字.

此时我想将CEdit控件的输入限制为仅数字.同样,在此之后,如果用户再次单击字母数字单选按钮,我想删除该限制.

c++ windows mfc input cedit

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

如何在每次输入数字时检查由连续用户输入提供的二进制数是否可被5整除?

用户可以输入0或1,它将附加到起始编号为0.

每次用户添加一个数字时,程序应该判断整个数字是否可以被5整除.

例:

  1. 第一个数字是0.
  2. 用户输入'1' - 完整号码为'1' - 答案为否.
  3. 用户输入'0' - 完整号码是'10' - 答案是否定的.
  4. 用户输入"1" - 完整号码为"101" - 答案是肯定的.

我知道答案与最后一个余数有关,并保留最后的余数,但我找不到精确的计算或逻辑或数学来做到这一点.

c binary

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