This question already has answers here:
Crash or “segmentation fault” when data is copied/scanned/read to an uninitialized pointer
(5个答案)
3年前关闭。
我正在用C语言写一篇著作,但在这里我无法识别问题。当我在调试中运行代码时,我遇到了段错误。我不知道怎么了。以前,我将内存分配给了poleNazvu,但没有出现分段错误,而是给了我“试图释放非堆对象”的权限,所以这不是一种方法。请告诉我如何处理细分错误。它发生在我在代码中将其标记为strcpy(poleNazvu ...)的行上。 ALOKACE_POLI = 200; ALOKACE_MALA = 20;它的作用是需要“ john 500”,而levaStrana得到“ john”,而pravaStrana得到“ 500”,所以我试图将levaStrana复制到poleNazvu,将pravaStrana复制到poleKreditu。该代码段的结尾是分段错误。
目标
在复制之前为指针分配内存,或者使用
还有一些事情实际上并没有任何意义,例如,为什么要使用
也许您应该使
那你就做
当然,这要求
(5个答案)
3年前关闭。
我正在用C语言写一篇著作,但在这里我无法识别问题。当我在调试中运行代码时,我遇到了段错误。我不知道怎么了。以前,我将内存分配给了poleNazvu,但没有出现分段错误,而是给了我“试图释放非堆对象”的权限,所以这不是一种方法。请告诉我如何处理细分错误。它发生在我在代码中将其标记为strcpy(poleNazvu ...)的行上。 ALOKACE_POLI = 200; ALOKACE_MALA = 20;它的作用是需要“ john 500”,而levaStrana得到“ john”,而pravaStrana得到“ 500”,所以我试图将levaStrana复制到poleNazvu,将pravaStrana复制到poleKreditu。该代码段的结尾是分段错误。
void menuHighlights(void) //menu se zebricky uzivatelu
{
char vyber3, * poleNazvu[ALOKACE_POLI][ALOKACE_MALA],line[ALOKACE_LINE];
char * prohodJmeno, * menic, * separator, * levaStrana, * pravaStrana;
int poleKreditu[ALOKACE_POLI], count=0, countMax=0, prohodCislo, d;
FILE *NACTENI;
//int alokace1=0, alokace2=0; //vytvoreni promenne pro soubor
fflush(stdin); //vyprazdneni bufferu
system("cls"); // vycisteni obrazovky
printf("\nZebricek nejlepsich hracu:\n"); //tisk hlavicky
fflush(stdin); //buffer
NACTENI = fopen(SOUBOR_HRACU , "r"); //ulozeni otevreneho souboru do promenne
if(NACTENI == NULL) { //jestlize v promenne nic neni
perror("Soubor nenalezen."); //vypis error
Sleep(HODNOTA_BIG_SLEEP); //nech uzivatel aby si to precetl
exit(1); //a pak ukonci seanci
}
while (fgets(line, sizeof line, NACTENI) != NULL) { //pokud radek nacteny ze souboru nebude prazdny
fflush(stdin); //buffer
menic=line; //anti-decay opatreni promenne line
separator = " ";
levaStrana = strtok(menic, separator);
pravaStrana = strtok(NULL, "");
//if ((poleNazvu[count][ALOKACE_MALA-1]=(char *)malloc(ALOKACE_PROHAZOVANI*sizeof(char)))==NULL) {
// printf("Nedostatek pameti. Ukoncuji.");
// exit(1);
//}
//alokace1=1;
strcpy(poleNazvu[count][ALOKACE_MALA-1],levaStrana); //ITS HERE
poleKreditu[count]=atoi(pravaStrana);
if (countMax<count) {
countMax=count;
}
count++;
}
最佳答案
在通话中
strcpy(poleNazvu[count][ALOKACE_MALA-1],levaStrana); //ITS HERE
目标
poleNazvu[count][ALOKACE_MALA-1]
是未初始化的指针。它的值不确定,导致不确定的行为。在复制之前为指针分配内存,或者使用
strdup
(在单个调用中进行分配和复制),或者使poleNazvu
不是指向char
的指针数组的数组。还有一些事情实际上并没有任何意义,例如,为什么要使用
poleNazvu[count][ALOKACE_MALA-1]
作为目标?它将始终将字符串复制到数组数组中的相同条目。也许您应该使
poleNazvu
成为char
的数组的数组,而不是使指向char
的指针的数组的数组?喜欢char poleNazvu[ALOKACE_POLI][ALOKACE_MALA];
那你就做
strcpy(poleNazvu[count], levaStrana);
当然,这要求
levaStrana
中字符串的长度小于ALOKACE_MALA
个字符。所以也许改用strncpy
和显式终止,例如strncpy(poleNazvu[count], levaStrana, ALOKACE_MALA - 2);
poleNazvu[count][ALOKACE_MALA - 1] = '\0';
10-08 03:53