在这个问题,有人建议意见,我应该不会投的结果malloc,即
int *sieve = malloc(sizeof(int) * length);
而不是:
int *sieve = (int *) malloc(sizeof(int) * length);
为什么会这样呢?
现在在人们开始将它标记为dup之前,我已经阅读了以下所有内容,其中没有一个提供我正在寻找的答案:
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;
}
用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
那么,任何人都可以提供一个特定的代码示例,说明由于转换malloc返回值而可能发生的编译或运行时错误,或者这仅仅是一个城市传奇?
编辑我在这个问题上遇到了两个写得很好的论点:
一个让我烦恼的简单问题.假设我在main中定义了一个数组,就像这样int arr[5].现在,如果我仍然在main中并且我设置int i = sizeof(arr)/sizeof(arr[0])然后我被设置为5,但是如果我将数组作为函数参数传递并在此函数中执行完全相同的计算,则得到不同的数字.这是为什么?起初我认为它是因为在一个函数中arr是一个指针,但据我所知,它arr也是一个指针在主内部!
另外,如果我做一些非常相似的事情,我只是动态地初始化数组,我得到了奇怪的结果:
int *arr = (int*) malloc(sizeof(int) * 5);
int length = sizeof(*arr) / sizeof(arr[0]);
printf("%d\n",length);
这里的输出是1.有什么想法吗?提前致谢!
我无法访问我的原始帐户.如果可能,请主持人合并帐户.
这是我的问题.以下C程序是IA-64的段错误,但在IA-32上工作正常.
int main()
  {
      int* p;
      p = (int*)malloc(sizeof(int));
      *p = 10;
      return 0;
  }
为什么会这样?
我正在尝试初始化整数数组并将所有元素设置为1.我需要数组的上限为4294967295,或者是32位的最大数unsigned int.
这对我来说似乎是一项微不足道的任务,应该是,但我遇到了segfault.我可以运行for循环空,它似乎工作正常(尽管很慢,但它处理了近43亿个数字,所以我不会抱怨).当我尝试在循环中执行任何类型的操作时,问题似乎出现了.我在下面的指令 - primeArray[i] = 1;- 导致segfault错误.尽我所知,这不应该让我超越阵列.如果我注释掉那条线,没有segfault.
已经晚了,我疲惫的眼睛可能只是缺少一些简单的东西,但我可以使用另一双.
这是我得到的:
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <stdint.h>
#define LIMIT 0xFFFFFFFF;
int main(int argc, char const *argv[])
{
    uint32_t i;
    uint32_t numberOfPrimes = LIMIT;        // hardcoded for debugging
    int *primeArray = (int*) malloc(numberOfPrimes * sizeof(int));
    for (i = 0; i < numberOfPrimes; ++i) {
        primeArray[i] = 1;
    }
}
我正在经历这里,发现如果我们不包含stdlib.h,则转换malloc会导致不需要的行为,转换返回值以及系统上的指针和整数大小是否不同.
下面是SO问题中给出的代码片段.这是在64位机器上尝试的,其中指针和整数大小不同.
int main()
{
      int* p;
      p = (int*)malloc(sizeof(int));
      *p = 10;
      return 0;
}
如果我们不包含stdlib.h,编译器将假定malloc返回类型为int,并且转换它并分配给不同大小的指针可能会导致不需要的行为.但我的问题是,为什么铸造int到int*并将其分配给不同大小的指针可能会导致问题.