當我在 codewars 上編程時,我遇到了一個名為 signal 6 的錯誤。
該程式在大多數單元測驗中都能正常作業,但在其中一個測驗中出錯: Test Crashed Caught unexpected signal: 6
如果您知道錯誤的原因可能是什么,我會很高興為您提供幫助。謝謝!
這是分配條件:
kata 的目的是分解 n! (階乘 n) 轉化為其質因數。
例子:
n = 12; decomp(12) -> "2^10 * 3^5 * 5^2 * 7 * 11" 從 12 開始!能被 2 整除 10 次,被 3 整除 5 次,被 5 整除 2 次,被 7 和 11 整除一次。
n = 22; decomp(22) -> "2^19 * 3^9 * 5^4 * 7^3 * 11^2 * 13 * 17 * 19"
n = 25; decomp(25) -> 2^22 * 3^10 * 5^6 * 7^3 * 11^2 * 13 * 17 * 19 * 23 素數應該按升序排列。當素數的指數為 1 時,不要輸入指數。
注意:函式是 decomp(n) 并且應該回傳 n 的分解!以素數的遞增順序將其轉換為素數,作為一個字串。階乘可以是一個非常大的數字(4000!有 12674 位,n 可以從 300 到 4000)。在 Fortran 中 - 與任何其他語言一樣 - 回傳的字串不允許包含任何多余的尾隨空格:您可以使用動態分配的字串。
這是我的解決方案:
#include <stdlib.h>
char *func(char* p, int num);
char *decomp(int n)
{
int size = 100;
int* p = (int*)malloc(sizeof(int) * size);
char* res = (char*)malloc(sizeof(char) * 200);
char* res2 = res;
for (int i = 0; i < size; i )
{
*(p i) = 0;
}
for (int i = 2; i <= n; i )
{
for (int j = 2, k = i; k > 1;)
{
if (k % j == 0)
{
while (j > size)
{
size = 100;
p = (int*)realloc(p, size);
}
*(p j) = 1;
k /= j;
}
else
{
j ;
}
}
}
for (int i = 0; i < size; i )
{
if (*(p i) != 0)
{
res = func(res, i);
if (*(p i) != 1)
{
*(res ) = '^';
res = func(res, *(p i));
}
*(res ) = ' ';
*(res ) = '*';
*(res ) = ' ';
}
}
*(res - 3) = '\0';
return res2;
}
//takes a pointer to memory and convert there integer to str
char *func(char* p, int num)
{
int len = 0;
for (int i = 1; num / i > 0; i *= 10)
len ;
char* p2 = (char*)malloc(sizeof(char) * len 4);
while (num > 0)
{
*(p2 ) = (num % 10) '0';
num /= 10;
}
p2--;
for (int i = 0; i < len; i )
{
*(p ) = *(p2--);
}
*p = '\0';
return p;
}
uj5u.com熱心網友回復:
問題出在你的realloc陳述上。你有:
while (j > size)
{
size = 100;
p = (int*)realloc(p, size);
}
它應該在哪里
while (j > size)
{
size = 100;
p = (int*)realloc(p, sizeof(int)*size);
}
因為您正在分配一個陣列 if ins 并且sizeof(int) > 1您沒有分配足夠的記憶體。這會導致您寫入尚未分配的記憶體,并且有足夠大的引數decomp導致您寫入非法地址。
這會導致您的程式被殺死,SIGABRT通常是信號 6。
uj5u.com熱心網友回復:
信號 6 是SIGABRT,通常作為例程呼叫的一部分接收,該abort()例程也被宏呼叫,如assert(). 你一直在使用assert()嗎?在您的代碼中,還是某些庫代碼使用它?您提供的資訊不可能更進一步。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/427885.html
標籤:C
