C 使用声明的变量初始化数组
我已经尝试了下面的代码,但不起作用。如果我给出常量,则显示“初始值设定项元素不是常量”的错误。。它仍然不起作用。请帮忙C 使用声明的变量初始化数组,c,arrays,pointers,variables,initialization,C,Arrays,Pointers,Variables,Initialization,我已经尝试了下面的代码,但不起作用。如果我给出常量,则显示“初始值设定项元素不是常量”的错误。。它仍然不起作用。请帮忙 #include<stdio.h> int* ret() { int x=0; int y=0; int b[]={x,y}; return b; } int main() { printf("My name is sudha\n\n"); int* m=ret(); for(int i=0;i<2;i
#include<stdio.h>
int* ret()
{
int x=0;
int y=0;
int b[]={x,y};
return b;
}
int main()
{
printf("My name is sudha\n\n");
int* m=ret();
for(int i=0;i<2;i++)
printf("%d",m[i]);
return 0;
}
#包括
int*ret()
{
int x=0;
int y=0;
int b[]={x,y};
返回b;
}
int main()
{
printf(“我的名字是sudha\n\n”);
int*m=ret();
对于(int i=0;i,代码中有两个错误:
- 您正在初始值设定项中使用非常量表达式,并且
- 您正在从函数返回指向本地的指针
这可以通过返回手动初始化的-ed数组来修复:
int* ret() {
int x=0;
int y=0;
int *b = malloc(2 * sizeof(*b));
b[0] = x;
b[1] = y;
return b;
}
完成后,您需要查看结果:
int* m=ret();
for(int i=0;i<2;i++)
printf("%d",m[i]);
free(m); // <<=== Add this call
int*m=ret();
对于(int i=0;i可能的重复项为我编译并运行,但是当您printf()时,您正在访问未分配的内存,这是未定义的行为。一旦ret()返回int b[]没有人知道为什么在VisualStudioC++中我会这样编译?在C和C++之间如何初始化数组有很大的不同。我总是不允许使用新的可变长度数组,但是我的编译器允许我用随机数初始化数组的值。GCC编译器编译它。唯一的问题是R。et()函数返回一个指向c中未定义行为的局部变量的指针。此外,它不会在C89中编译,因为循环初始化i。@MCG:如果使用标准兼容模式,则不会编译。使用malloc
不会更改数组“初始化”,因为malloc
ed数组可能有noi初始化器。自动/静态数组可以使用相同的初始化器。唯一可能使用malloc
的点是数组的生存期。还有其他方法可以实现这一点。@Olaf对我来说,这是“帮助我修复此代码”问题。我从提供初始值的更广泛意义上理解初始化。如果除了malloc
之外,还有其他方法可以将数组的生存期保留在分配给它的函数之外,而不使数组成为静态的或全局的,我很想知道它是什么。您可以在解构一个结构,并返回该结构。@DasBinkenLight:是的,这个术语是含糊不清的。但在这里,它显然是在标准意义上使用的:用定义设置值。我在注释中故意使用引号表示我指的是正常的初始赋值。我没有排除静态数组作为选项(没有“全局”选项)变量;它们只是静态的)。谢谢你的回答。但是@dasblinkenlight的代码仍然不能工作