除錯的時候發現自己需要的部分指標被擦除了,導致這個錯誤。但我不明白為什么“i”或“j”宣告會這樣做......
我的代碼
#include <stdio.h>
#include <stdbool.h>
#include <malloc.h>
typedef unsigned long bitset_index_t;
typedef struct
{
bitset_index_t index;
unsigned short *vyraz;
} bitset_t;
void bitset_alloc(bitset_t **pole, unsigned int velikost)
{
if (velikost < 1)
{
// todo error
}
bitset_t new_bitset = {.index = 0, .vyraz = NULL};
new_bitset.vyraz = malloc(sizeof(unsigned short) * velikost);
if (new_bitset.vyraz == NULL)
{
// todo error
}
memset(new_bitset.vyraz, 0, sizeof(unsigned short) * (velikost));
for (unsigned int i = 0; i < velikost; i)
{
new_bitset.vyraz[i] = 0;
new_bitset.index ;
}
*pole = &new_bitset;
}
void Eratosthenes(bitset_t *pole)
{
pole->vyraz[0] = 1;
pole->vyraz[0] = 1;
unsigned long velikost = pole->index;
for (unsigned long i = 2; i < velikost; i )
{
for (unsigned long j = i; j * i < velikost 1; j )
{
if (pole->vyraz[i])
break;
pole->vyraz[i * j] = 1;
}
}
unsigned short count_prvocisel = 0;
for (unsigned long i = pole->index; i > 0; i--)
{
if (count_prvocisel < 10)
{
if (pole->vyraz[i])
continue;
printf("%lu ", i);
count_prvocisel ;
}
else
break;
}
}
int main()
{
bitset_t *test = NULL;
bitset_alloc(&test, 10);
Eratosthenes(test);
}
這是第一個回圈之前的資料 在此處輸入影像描述
這是發生錯誤時在此處輸入影像描述
uj5u.com熱心網友回復:
您已經“回傳”了區域變數的地址
void bitset_alloc(bitset_t** pole, unsigned int velikost)
{
if (velikost < 1)
{
// todo error
}
bitset_t new_bitset = { .index = 0, .vyraz = NULL }; <<<<========
new_bitset.vyraz = malloc(sizeof(unsigned short) * velikost);
if (new_bitset.vyraz == NULL)
{
// todo error
}
memset(new_bitset.vyraz, 0, sizeof(unsigned short) * (velikost));
for (unsigned int i = 0; i < velikost; i)
{
new_bitset.vyraz[i] = 0;
new_bitset.index ;
}
*pole = &new_bitset; <<<<<=========
}
'new_bitset' 是一個區域變數,一旦這個函式退出,它就會被釋放,保存它的值 - 有效地回傳它 - 是無效的并導致 UB。
要么 malloc 要么在'main'中創建它
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/442961.html
上一篇:php中的while演算法回圈
下一篇:如何使結構指向前一個陣列值
