當我嘗試運行此代碼時,我收到錯誤:錯誤:'list1' undeclared(第一次在此函式中使用)。但是我已經在 main() 中宣告了變數,我也嘗試在頂部的 text1、text2 和 count 下宣告它。但后來它說“初始化元素不是恒定的”。我試過用谷歌搜索它,但沒有運氣。順便說一句,代碼還沒有完成,但我無法克服這個錯誤,只想修復它。謝謝
#include <stdio.h>
#include <stdlib.h>
char *text1 = "This is a string.";
char *text2 = "Yet another thing.";
int *count = 0;
void printlist(const int* lst){
printf("ASCII codes and corresponding characters.\n");
while(*lst != 0){
printf("0xX '%c' ", *lst, (char)*lst);
lst ;
}
printf("\n");
}
void endian_proof(const char* c){
printf("\nEndian experiment: 0xx,0xx,0xx,0xx\n",
(int)*c,(int)*(c 1), (int)*(c 2), (int)*(c 3));
}
void copycodes(char *text, int *list, int *counter){
while(*text != 0){
*list = *text;
list ;
text ;
}
}
void work(){
copycodes(&text1, &list1, &count);
}
int main(void){
int *list1 = (int *)(malloc(80));
int *list2 = (int *)(malloc(80));
work();
printf("\nlist1: ");
printlist(list1);
printf("\nlist2: ");
printlist(list2);
printf("\nCount = %d\n", count);
endian_proof((char*) &count);
}
uj5u.com熱心網友回復:
作為@EugeneSh。說,變數list1和list2是本地的main(),因此不在其他函式的范圍內。雖然您可以通過簡單地將它們初始化為NULL然后將它們設定為來創建全域變數,但將它們作為引數main()傳遞給 會更有意義:list1work()
void work(int* list){
copycodes(text1, list, count);
}
需要注意的幾點:
您不需要或不想從
malloc()(或calloc()就此而言)轉換回傳值。這是關于轉換指標的通常規則的一個例外。正如@melonduofromage 所說,您需要使用
sizeof(int)來判斷malloc()分配的元素有多大。相反,您可以使用calloc()它,它專門用于分配陣列。list1 = calloc(20, sizeof(int));將指標傳遞給接受指標引數的函式時,您不希望或不需要對
&相關指標使用參考 ( ) 運算子。僅當您將指標傳遞給指標引數時才需要這樣做。作為一般規則,除非替代方案更令人困惑,否則最好避免使用全域變數。在這種情況下,您需要將更多引數傳遞給各種函式,但改進的分解將使 IMAO 值得。
同樣作為一般規則,如果您發現自己使用模式
var1,var2,var3...varN,那么您應該將變數捆綁到一個陣列中(如果它們彼此相關),或者找到更具描述性的名稱(如果它們不相關)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/430737.html
上一篇:如何通過c中的函式訪問typedef-struct中的二維陣列指標
下一篇:手動為指標分配記憶體地址的問題
