编译器说变量未声明,即使它已声明

Compiler says variable is undeclared even though it is declared

当我尝试 运行 此代码时出现错误:错误:'list1' 未声明(首次在此函数中使用)。但我已经在 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("0x%03X '%c' ", *lst, (char)*lst);
    lst++;
  }
  printf("\n");
}

void endian_proof(const char* c){
  printf("\nEndian experiment: 0x%02x,0x%02x,0x%02x,0x%02x\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);
}

作为@EugeneSh。也就是说,变量 list1list2main() 的局部变量,因此不在其他函数的范围内。虽然您可以通过简单地将它们初始化为 NULL 然后将它们设置为 main() 来创建全局变量,但将 list1 作为参数传递给 work() 会更有意义:

void work(int* list){
    copycodes(text1, list, count);
}

需要注意的几点:

  • 您不需要也不想从 malloc()(或 calloc() 转换为 return 值。这是关于转换指针的通常规则的一个例外。

  • 正如@melonduofromage 所说,您需要使用 sizeof(int) 来告诉 malloc() 分配的元素有多大。相反,您可以改用 calloc(),它专门用于分配数组。

    list1 = calloc(20, sizeof(int));

  • 将指针传递给接受指针参数的函数时,您不想或不需要对相关指针使用引用 (&) 运算符。仅当您将指针传递给指针参数时才需要这样做。

  • 作为一般规则,最好避免使用全局变量,除非替代方法更令人困惑。在这种情况下,您需要将更多参数传递给各种函数,但改进的分解将使它值得 IMAO。

  • 同样作为一般规则,如果您发现自己使用模式 var1var2var3...varN,那么如果变量彼此相关,您应该将它们捆绑到一个数组中,否则应该找到更具描述性的名称。