我是編碼新手。作為一個練習題,我撰寫了一個程式來按字母順序對字串進行排序,就像在字典中一樣。我的程式將以下內容作為輸入:(a) 用戶想到的字串數量和 (b) 字串,一個接一個,每個都通過按 Enter 鍵終止。它將初始輸入存盤在大小為 MAXSTR 的緩沖區陣列中,同時計算字符數。然后它在記憶體位置 input[i] 創建分配所需大小的記憶體,并將緩沖區復制到該位置。它還創建一個索引陣列,陣列元素的值為 0、1、2 ...,每個元素對應于第 0 個字串、第 1 個字串、第 2 個字串 ...等。函式 dictsort 根據對應字串的字母位置對索引陣列進行排序。我的程式在 Linux 機器上運行流暢。但是,在 Windows 上,它可以編譯,“輸入[i]=(char )malloc(j sizeof(char));” . 如果你們中的任何人都可以指出正在發生的事情,那將有很大的幫助。請注意,我的問題僅在于主要功能。排序函式作業正常,因此下面的代碼既不包含也不注釋掉這些函式。
#define MAX 10000
#define MAXSTR 100
#include<stdio.h>
#include<stdlib.h>
//int dictsort(char **mainarray, size_t *indexarray, size_t elementcount);
//int strcompare(char* str1, char* str2);
//int getvalue(int input);
int main(void){
size_t n, i, j,k;
char buffer[MAXSTR];
int c;
size_t *index;
char **input;
printf("Input number of elements:\t");
scanf("%ld", &n);
n=n<MAX ? n : MAX;
index=(size_t*)malloc(n*sizeof(size_t));
getchar(); // flush the newline after scanf
for(i=0;i<n; i){
index[i]=i;
printf("Input element %ld:\t", i 1);
j=0;
while(((c=getchar())!=EOF) && (c!='\n') && (c!='\0') && (j<MAXSTR-1)){
buffer[j]=c;
j;
}
buffer[j]='\0';
printf("Upto 1\n"); //program comes upto here
input[i]=(char*)malloc(j*sizeof(char));
printf("Upto 2\n"); //never reaches here
for(k=0;k<j 1; k){
input[i][k]=buffer[k];
}
}
//dictsort(input, index, n); //disabled for debugging
printf("The sorted array is: \n");
for (i=0;i<n; i){
printf("%s ", input[index[i]]);
}
for(i=0;i<n; i){
free(input[i]);
}
free(index);
return 0;
}
uj5u.com熱心網友回復:
第一個錯誤:
您正在為indexand分配記憶體input[i],但不是為input它自己分配記憶體。這意味著您在以下行取消參考未初始化的指標:
input[i]=(char*)malloc(j*sizeof(char));
這將呼叫undefined behavior,這解釋了為什么它在一個平臺上的該行崩潰,但在另一個平臺上作業。
第二個錯誤:
線
input[i]=(char*)malloc(j*sizeof(char));
不會分配足夠的空間來存盤字串。由于j是沒有終止空字符的字串的大小,因此您必須j 1改為分配位元組。
由于沒有為字串分配足夠數量的位元組,以下回圈將input[i]越界訪問記憶體緩沖區:
for(k=0;k<j 1; k){
input[i][k]=buffer[k];
}
這將呼叫未定義的行為。
第三個錯誤:
程式中未定義行為的另一個來源是以下行:
scanf("%ld", &n);
正確的轉換格式說明符size_t是%zu,不是%ld。有關詳細資訊,請參閱該函式的檔案scanf。
在 64 位 Microsoft Windows 上,along的寬度為 4 位元組,但 asize_t的寬度為 8 位元組。因此,因為您使用的是格式說明符long而不是size_t,所以該函式scanf可能只寫入變數的一半,而變數n的另一半未初始化。n當您在程式后面讀取 的值時,這很可能會造成麻煩。
scanf假設您啟用了所有編譯器警告,大多數編譯器都會警告您使用錯誤的轉換格式說明符。您可能想閱讀以下內容:
為什么我應該總是啟用編譯器警告?
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/474094.html
下一篇:`offsetof(structDerived,super.x)==offsetof(structBase,x)`在C中是否成立?
