c++ malloc 分段错误

发布于 2024-08-30 09:54:32 字数 629 浏览 7 评论 0原文

我有一个关于 malloc() 的问题。这很奇怪。 我的代码如下。 我使用随机生成器来生成数组的元素。 该数组由 malloc() 打开。 如果数组大小小于8192,就可以。如果大小大于8192,则显示段错误。

void random_generator(int num, int * array) {

  srand((unsigned)time(0)); 
  int random_integer; 
  for(int index=0; index< num; index++){ 
    random_integer = (rand()%10000)+1; 
    *(array+index) = random_integer; 
    cout << index << endl;
  } 
}

int main() {
  int array_size = 10000;
  int *input_array;
  input_array = (int*) malloc((array_size));
  random_generator(8192, input_array);    // if the number is larger than 8192, segment fault
  free(input_array);
}

I have a problem about malloc(). It is weird.
My code is in the following.
I use random generator to generate elements for an array.
The array is opened by malloc().
If the array size is smaller than 8192, it is OK. If the size is larger than 8192, it shows segment fault.

void random_generator(int num, int * array) {

  srand((unsigned)time(0)); 
  int random_integer; 
  for(int index=0; index< num; index++){ 
    random_integer = (rand()%10000)+1; 
    *(array+index) = random_integer; 
    cout << index << endl;
  } 
}

int main() {
  int array_size = 10000;
  int *input_array;
  input_array = (int*) malloc((array_size));
  random_generator(8192, input_array);    // if the number is larger than 8192, segment fault
  free(input_array);
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(7

演出会有结束 2024-09-06 09:54:32

malloc() 采用字节大小,而不是元素数量。 int 的大小通常为 4 个字节,因此您实际上只为 2500 个整数分配了足够的内存。您正在分配 array_size 字节,而您应该分配 array_size * sizeof(int) 字节。

修复

因此,该错误将通过input_array = (int*) malloc(array_size * sizeof(int));

。 PS 永远不要假设您知道 int 或任何其他数据类型,因为它依赖于平台。始终使用sizeof()

PPS 这实际上是一个 C 问题,而不是一个 C++ 问题。如果您实际上使用 C++,您应该考虑使用 newdelete [] 而不是 malloc()free()< /code>,或者更好的是使用 std::vector 而不是数组,正如 Neil 指出的那样。

malloc() takes the size in bytes, not the number of elements. The size of an int is typcially 4 bytes, so you are actually allocating only enough memory for 2500 integers. You are allocating array_size bytes, while you should be allocating array_size * sizeof(int) bytes.

So, the error will be fixed by

input_array = (int*) malloc(array_size * sizeof(int));

P.S. Never assume that you know the size of an int or any other data type, as it is platform dependent. Always use sizeof().

P.P.S. This is really a C question, rather than a C++ question. If you are actually using C++, you should consider using new and delete [] instead of malloc() and free(), or better yet use std::vector instead of an array, as Neil pointed out.

友欢 2024-09-06 09:54:32

您想要:

input_array = (int*) malloc( array_size * sizeof(int) );

您可能会考虑更简单的:

input_array = new int[ array_size ];
// stuff
delete [] input_array;

甚至:

std::vector <int> input_array( array_size );

而不必担心调用 free 或 delete,或者担心异常。

You want:

input_array = (int*) malloc( array_size * sizeof(int) );

you might consider the much simpler:

input_array = new int[ array_size ];
// stuff
delete [] input_array;

or even:

std::vector <int> input_array( array_size );

and not have to worry about calling free or delete, or about exceptions.

贱贱哒 2024-09-06 09:54:32

看到它的 C++,你最好执行以下操作:

int main() 
{
  int array_size = 8192;
  int *input_array = new int[array_size];
  random_generator(array_size, input_array);
  delete[] input_array;
}

编辑:或者更好:

#include <vector>

int main() 
{
  int array_size = 8192;
  std::vector< int > array;
  array.resize( array_size );
  random_generator(array_size, &array.front());
}

甚至不用担心释放:D

Seeing as its C++ you'd be much better off doing the following:

int main() 
{
  int array_size = 8192;
  int *input_array = new int[array_size];
  random_generator(array_size, input_array);
  delete[] input_array;
}

Edit: or better still:

#include <vector>

int main() 
{
  int array_size = 8192;
  std::vector< int > array;
  array.resize( array_size );
  random_generator(array_size, &array.front());
}

And not even worry about the deallocating :D

も让我眼熟你 2024-09-06 09:54:32

input_array = (int*) malloc(sizeof(int) * (array_size));

这是因为 malloc 的参数是字节数,而 int 一般为 4 个字节长。

input_array = (int*) malloc(sizeof(int) * (array_size));

It's because the param to malloc is the byte count and int is generally 4 bytes long.

梦幻的味道 2024-09-06 09:54:32

您使用的 malloc 调用是错误的。你应该使用:

malloc(sizeof(int) * array_size)

我认为。

The malloc call you are using is wrong. You should be using:

malloc(sizeof(int) * array_size)

I think.

生来就爱笑 2024-09-06 09:54:32

您正在分配 array_size 字节,但需要 array_size 整数。尝试在 malloc 中分配 array_size*sizeof(int) 字节。

You're allocating array_size bytes, but you need array_size integers. Try allocating array_size*sizeof(int) bytes in malloc.

极致的悲 2024-09-06 09:54:32

其他人都已经掩盖了动态分配中的错误。
但你真的想要动态分配吗?

int main() {
  int const array_size = 10000;
  int input_array[array_size];
  random_generator(8192, input_array); 
}

Everybody else has coverted the mistake in dynamic allocation.
But do you really want dynamic allocation?

int main() {
  int const array_size = 10000;
  int input_array[array_size];
  random_generator(8192, input_array); 
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文