相关疑难解决方法(0)

具体来说,铸造malloc的结果有什么危险?

现在在人们开始将它标记为dup之前,我已经阅读了以下所有内容,其中没有一个提供我正在寻找的答案:

  1. C FAQ:转换malloc的返回值有什么问题?
  2. SO:我应该显式地转换malloc()的返回值吗?
  3. SO:在C中不必要的指针转换
  4. SO:我是否施放了malloc的结果?

C FAQ和上述问题的许多答案都引用了一个神秘的错误,即铸造malloc的返回值可以隐藏; 但是,它们都没有在实践中给出这种错误的具体例子.现在要注意我说的错误,而不是警告.

现在给出以下代码:

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

int main(int argc, char** argv) {

    char * p = /*(char*)*/malloc(10);
    strcpy(p, "hello");
    printf("%s\n", p);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

用gcc 4.2编译上面的代码,有和没有强制转换都会给出相同的警告,并且程序正确执行并在两种情况下都提供相同的结果.

anon@anon:~/$ gcc -Wextra nostdlib_malloc.c -o nostdlib_malloc
nostdlib_malloc.c: In function ‘main’:
nostdlib_malloc.c:7: warning: incompatible implicit declaration of built-in function ‘malloc’
anon@anon:~/$ ./nostdlib_malloc 
hello
Run Code Online (Sandbox Code Playgroud)

那么,任何人都可以提供一个特定的代码示例,说明由于转换malloc返回值而可能发生的编译或运行时错误,或者这仅仅是一个城市传奇?

编辑我在这个问题上遇到了两个写得很好的论点:

  1. 利于强制转换:CERT建议:立即将内存分配函数调用的结果转换为指向已分配类型的指针
  2. 反对强制转换 (截至2012-02-14的404错误:使用2010-01-27中的互联网归档Wayback Machine副本.{2016-03-18:"由于robots.txt而无法抓取或显示页面."})

c

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

用于找到大于或等于给定值的2的最小幂的算法

我需要找到大于或等于给定值的2的最小幂.到目前为止,我有这个:

int value = 3221; // 3221 is just an example, could be any number
int result = 1;

while (result < value) result <<= 1;
Run Code Online (Sandbox Code Playgroud)

它工作正常,但感觉有点幼稚.这个问题有更好的算法吗?

编辑.有一些很好的Assembler建议,所以我将这些标签添加到问题中.

c++ algorithm assembly

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

再次分配相同的内存空间

在每次循环迭代中,一次又一次地声明变量j.那为什么它的地址保持不变

  • 不应该每次都给它一些随机地址吗?
  • 这个编译器是否依赖?
#include<stdio.h>
#include<malloc.h>

int main()
{
    int i=3;
    while (i--)
    {
        int j;
        printf("%p\n", &j);
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

测试运行:-

shadyabhi@shadyabhi-desktop:~/c$ gcc test.c
shadyabhi@shadyabhi-desktop:~/c$ ./a.out
0x7fffc0b8e138
0x7fffc0b8e138
0x7fffc0b8e138
shadyabhi@shadyabhi-desktop:~/c$
Run Code Online (Sandbox Code Playgroud)

c unix linux gcc

6
推荐指数
3
解决办法
362
查看次数

C中的Implict函数声明是否实际生成了对象代码?

在讨论中关于转换malloc许多人的返回值已声称隐式声明malloc会导致返回值被转换为int然后重新转换回T*可能导致在以下情况下截断指针:

sizeof(int) < sizeof(void*)
Run Code Online (Sandbox Code Playgroud)

这意味着编译器会执行以下操作:

  1. 链接并调用正确的目标代码定义 malloc
  2. 生成目标代码以将返回值转换为较短的int类型
  3. 生成目标代码以转换回更大的目标指针类型

有人真的可以证明这发生了吗?在64位Linux上使用一些示例代码说?

我自己做,但我无法访问64位机器.

c compiler-construction

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

ANSI C中的类型问题

我对ANSI C中输入的问题几乎没有:1.在char开头的"\ x"到char开头的0x之间有什么区别(或者在任何其他情况下这个问题).AFAIK,它们都意味着这是十六进制的..所以有什么区别.

  1. 将char转换为(unsigned),而不是(unsigned char) - 这是什么意思?为什么(无符号)'\ xFF'!= 0xFF?

谢谢!

c

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

标签 统计

c ×4

algorithm ×1

assembly ×1

c++ ×1

compiler-construction ×1

gcc ×1

linux ×1

unix ×1