C4996(函数unsafe)警告strcpy但不是memcpy

我在VS2010中编写代码,我碰巧在编译后看到编译器为strcpy和sprintf调用提供了C4996警告(“此函数或变量可能不安全”)。 但是,我无法获得memcpy的类似警告(并且可能在代码中有更多类似的’不安全’函数调用) int _tmain(int argc, _TCHAR* argv[]) { char buf1[100], buf2[100]; strcpy (buf1, buf2); // Warning C4996 displayed here asking to use strcpy_s instead memcpy (buf1, buf2, 100); // No warning here asking to use memcpy_s memcpy_s(buf1, 100, buf2, 100); return 0; } 为什么会这样? 如何在代码中为所有可能的不安全呼叫打开C4996警告?

如何在C中的分叉进程上使用POSIX信号量?

我想分叉多个进程,然后在它们上使用信号量。 这是我尝试过的: sem_init(&sem, 1, 1); /* semaphore*, pshared, value */ . . . if(pid != 0){ /* parent process */ wait(NULL); /* wait all child processes */ printf(“\nParent: All children have exited.\n”); . . /* cleanup semaphores */ sem_destroy(&sem); exit(0); } else{ /* child process */ sem_wait(&sem); /* P operation */ printf(” Child(%d) is in […]

使用可变长度数组是否安全?

我对可变长度数组感到担忧。 当我想动态分配一个数组时,如果不能分配足够的内存,我将得到null,我可以在程序中正确响应。 使用可变长度数组我不会得到这些信息。 我该怎么办?

正确的格式说明符打印指针或地址?

我应该使用哪种格式说明符来打印变量的地址? 下面很多我很困惑。 %u – 无符号整数 %x – hex值 %p – 无效指针 哪个是打印地址的最佳格式?

在不是地址/指针的值上使用LEA?

我试图理解地址计算指令是如何工作的,特别是使用leaq命令。 当我看到使用leaq进行算术运算的例子时,我感到困惑。 例如,以下C代码, long m12(long x) { return x*12; } 在组装中, leaq (%rdi, %rdi, 2), %rax salq $2, $rax 如果我的理解是正确的,leaq应该移动任何地址(%rdi, %rdi, 2) ,这应该是2*%rdi+%rdi ,评估为%rax 。 我感到困惑的是因为值x存储在%rdi ,这只是存储器地址,为什么%rdi乘以3然后左移这个存储器地址 2等于x乘以12? 是不是当我们将%rdi乘以3时,我们跳转到另一个不保持值x的内存地址?

GNU C中的__attribute __((const))vs __attribute __((pure))

GNU C中__attribute__((const))和__attribute__((pure))什么区别? __attribute__((const)) int f() { /* … */ return 4; } VS __attribute__((pure)) int f() { /* … */ return 4; }

为什么返回0是可选的?

为什么,如果我写 int main() { //… } 我不需要写return 0; 在mainfunction的最后? 编译器是否为我做了? 我用的是GCC / C99。

图像缩放和C / C ++中的旋转

缩放2D图像arrays的最佳方法是什么? 例如,假设我有一个1024 x 2048字节的图像,每个字节都是一个像素。 每个像素都是从0到255的灰度级。我希望能够通过任意因子缩放此图像并获得新图像。 因此,如果我将图像缩放0.68倍,我应该得到一个大小为0.68 * 1024 x 0.68 * 2048的新图像。 一些像素将相互折叠。 而且,如果我按比例缩放3.15,我会得到一个更大的图像,像素被复制。 那么,实现这一目标的最佳方法是什么? 接下来,我希望能够将图像旋转任意角度,范围为0到360度(0 – 2Pi)。 旋转后裁剪图像不是问题。 最好的方法是什么?

获取scanf以在读取换行符时退出?

如果我在终端输入5 5 ,按回车键,再次按回车键,我想退出循环。 int readCoefficents(double complex *c){ int i = 0; double real; double img; while(scanf(“%f %f”, &real, &img) == 2) c[i++] = real + img * I; c[i++] = 1 + 0*I; // most significant coefficient is assumed to be 1 return i; } 显然,该代码并没有为我完成工作(是的,我知道有一个缓冲区溢出等待发生)。 除非我输入一个字母(或一些非数字,而不是空白字符串),否则scanf不会退出。 读取空行后如何让scanf退出?

C或C ++中的大整数

我正在研究一个阶乘程序,当试图找到1000的阶乘时,程序不起作用。我认为大整数是解决方案; 它们是如何工作的? (在C或C ++中)