相关疑难解决方法(0)

我是否施放了malloc的结果?

这个问题,有人建议意见,我应该不会投的结果malloc,即

int *sieve = malloc(sizeof(int) * length);
Run Code Online (Sandbox Code Playgroud)

而不是:

int *sieve = (int *) malloc(sizeof(int) * length);
Run Code Online (Sandbox Code Playgroud)

为什么会这样呢?

c malloc casting

2318
推荐指数
27
解决办法
22万
查看次数

具体来说,铸造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万
查看次数

为什么我们需要转换malloc返回的内容?

    int length = strlen(src);
    char *structSpace = malloc(sizeof(String) + length + 1);
    String *string = (String*) structSpace;    
    int *string = (int*) structSpace;
Run Code Online (Sandbox Code Playgroud)

*我创建了一个名为String的结构

c heap malloc

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

无效转换'void*'到'struct*'

我是C的初学者.我正在尝试解决一些问题.当我编译代码时,我收到此错误.

[错误]从'void*'无效转换为'triangle*'[-fpermissive]

代码和目的解释如下.

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

struct triangle
{
    int a;
    int b;
    int c;
};

typedef struct triangle triangle;

//sort_by_area() function is here
int main()
{
    int n;
    scanf("%d", &n);
    triangle *tr = malloc(n * sizeof(triangle));
    for (int i = 0; i < n; i++) {
        scanf("%d%d%d", &tr[i].a, &tr[i].b, &tr[i].c);
    }
    sort_by_area(tr, n);
    for (int i = 0; i < n; i++) {
        printf("%d %d %d\n", tr[i].a, tr[i].b, tr[i].c);
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

正如你所看到我有结构,我试图用输入的数量为它分配内存.并尝试将其用于sort_by_area功能.但问题是 …

c malloc struct type-conversion

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

在C中返回malloc

int* dec2bin(int y){
    int *arr = (int*)malloc(sizeof(int)*5);
    int i;

    for (i=0; i<5; i++) arr[i]=0;

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

这是函数dec2bin的一部分.
在这段代码,我做的arr[0]arr[4]的一切0.
但是这个函数返回值1070192.我想回来00000.
我该怎么做才能解决这个问题?

c malloc

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

标签 统计

c ×5

malloc ×4

casting ×1

heap ×1

struct ×1

type-conversion ×1