我认为这个问题是这个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 *?
我有一个使用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)
我的问题是:
#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)
我该如何避免这种警告?
我正在浏览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)
我的问题:
for_each_possible_cpu扩展?#defines在里面打电话?per_cpu输出等于-1?#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.
今天我的老板和我正在讨论我写的一些代码.我的代码从给定的HTTP/HTTPS链接下载3个文件.我有多线程下载,以便所有3个文件同时下载3个独立的线程.在这次讨论中,我的老板告诉我,代码将被发送给最有可能运行旧硬件和软件的人(我说的是Windows 2000).
在此之前,我从未考虑过线程应用程序如何在旧硬件上扩展.我意识到,如果CPU只有1个内核,则线程无用,甚至可能会使性能恶化.我一直在想这个下载任务是否是I/O操作.这意味着,如果API被阻止等待来自HTTP/HTTPS服务器的信息,是否会同时安排另一个想要进行计算的线程?旧的操作系统会进行此类调度吗?
他说的另一件事是:由于代码将在旧机器上运行,我的应用程序不应该吃CPU.他说Sleep()在CPU密集型任务之后使用调用来允许其他程序有一些喘息空间.现在我总是觉得Sleep()在任何程序中使用都很糟糕.我错了吗?何时使用Sleep()合理?
谢谢你的期待!
有什么区别
char *array[10];
和
char (*array)[10]; ?
据我了解,
array 声明为大小为10的字符数组数组.[]优先级高于*.array 声明为指向大小为10的字符数组的指针.()并且[]具有相同的优先级,并且它们从左到右进行评估.然后*评估操作员.我的理解是否正确?即使它是正确的,我也会感到非常困惑.有人可以更清楚地解释一下这个区别吗?
我想检查我的代码的每一行的地址.我想知道:
我在这里想做什么?使用dumpbin获取信息.
我期待什么?
fun main add:0x0000
var int i add:0x2496
var int j add:0x249A
Run Code Online (Sandbox Code Playgroud)
非常感谢正确解释的适当帮助.
我有一些单选按钮,决定了给CEdit控件的输入类型.按照设计,我的CEdit控件接受数字和字符.
有没有办法只在用户点击提供的单选按钮时才将此输入限制为仅限数字?此外,当用户点击另一个选项(即字母数字模式)时,是否可以切换回来?
我设置我的CEdit控件以使用Visual C++的GUI接受字母数字字符(即右键单击控件 - >属性 - >"样式"选项卡 - >选择"数字").
一个用例示例:
CEdit控件一起考虑显示.此时我想将CEdit控件的输入限制为仅数字.同样,在此之后,如果用户再次单击字母数字单选按钮,我想删除该限制.
用户可以输入0或1,它将附加到起始编号为0.
每次用户添加一个数字时,程序应该判断整个数字是否可以被5整除.
例:
我知道答案与最后一个余数有关,并保留最后的余数,但我找不到精确的计算或逻辑或数学来做到这一点.