编译器说变量未声明,即使它已声明
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。也就是说,变量 list1
和 list2
是 main()
的局部变量,因此不在其他函数的范围内。虽然您可以通过简单地将它们初始化为 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。
同样作为一般规则,如果您发现自己使用模式 var1
、var2
、var3
...varN
,那么如果变量彼此相关,您应该将它们捆绑到一个数组中,否则应该找到更具描述性的名称。
当我尝试 运行 此代码时出现错误:错误:'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。也就是说,变量 list1
和 list2
是 main()
的局部变量,因此不在其他函数的范围内。虽然您可以通过简单地将它们初始化为 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。
同样作为一般规则,如果您发现自己使用模式
var1
、var2
、var3
...varN
,那么如果变量彼此相关,您应该将它们捆绑到一个数组中,否则应该找到更具描述性的名称。