如何在C中循环使用没有索引的数组?
我需要分配一个N大小的数组并给它赋值,没有int索引我怎么做 以下是我目前掌握的代码,但它不能满足我的需要:如何在C中循环使用没有索引的数组?,c,arrays,pointers,C,Arrays,Pointers,我需要分配一个N大小的数组并给它赋值,没有int索引我怎么做 以下是我目前掌握的代码,但它不能满足我的需要: #include <stdlib.h> #include <stdio.h> int main() { int *array; int n; printf("Size of array: "); scanf("%d", &n); array = (int*) malloc(n*sizeof(int));
#include <stdlib.h>
#include <stdio.h>
int main() {
int *array;
int n;
printf("Size of array: ");
scanf("%d", &n);
array = (int*) malloc(n*sizeof(int));
if (array == NULL) printf("Memory Fail");
for(; *array; array++)
{
printf("Store:\n");
scanf("%d", &n);
*array = n;
}
for(; *array; array++)
{
printf("Print: %d\n",*array);
}
free(array);
return 0;
}
#包括
#包括
int main(){
int*数组;
int n;
printf(“数组大小:”);
scanf(“%d”和“&n”);
数组=(int*)malloc(n*sizeof(int));
如果(数组==NULL)printf(“内存失败”);
对于(;*array;array++)
{
printf(“存储:\n”);
scanf(“%d”和“&n”);
*数组=n;
}
对于(;*array;array++)
{
printf(“打印:%d\n”,*数组);
}
自由(数组);
返回0;
}
如果你有一个数组
int*a,谢谢你代码>然后:
a[0] is equal to *a
a[1] is equal to *(a+1)
a[2] is equal to *(a+2)
因此,您可以通过对指针执行算术来遍历数组。如果您有一个数组int*a代码>然后:
a[0] is equal to *a
a[1] is equal to *(a+1)
a[2] is equal to *(a+2)
因此,您可以通过在指针上执行算术来遍历数组。您正在使用*array
作为条件,这意味着for
循环应该继续,除非*array
的计算结果为false,这仅当*array==0
时。实际上,您正在调用未定义的行为,因为您使用malloc
分配array
,并且在底层数据可能是任何数据时尝试取消对指针的引用,因为数据块已被取消初始化
您仍然需要某种类型的计数器进行循环,在本例中,您分配了n
项
/* I'm using a C99 construct by declaring variables in the for initializer */
for (int i = 0; i < n; ++i)
{
/* In your original code you re-assign your counter 'n', don't do that otherwise you lost the size of your array! */
int temp;
printf("Store: \n");
scanf("%d", &temp)
array[i] = temp;
}
/* This is your second loop which prints the items */
for (int i = 0; i < n; ++i)
{
printf("%d\n", array[i]);
}
/*我通过在for初始值设定项中声明变量来使用C99构造*/
对于(int i=0;i
另外,如果不保留数组
指针的副本,请不要操作该指针只能对malloc
返回的指针执行free
使用索引与操纵指针是一样的,否则你的教授就太可笑了。你使用的是*array
作为条件,这意味着for
循环应该继续,除非*array
的计算结果为false,这仅当*array==0
时。实际上,您正在调用未定义的行为,因为您使用malloc
分配array
,并且在底层数据可能是任何数据时尝试取消对指针的引用,因为数据块已被取消初始化
您仍然需要某种类型的计数器进行循环,在本例中,您分配了n
项
/* I'm using a C99 construct by declaring variables in the for initializer */
for (int i = 0; i < n; ++i)
{
/* In your original code you re-assign your counter 'n', don't do that otherwise you lost the size of your array! */
int temp;
printf("Store: \n");
scanf("%d", &temp)
array[i] = temp;
}
/* This is your second loop which prints the items */
for (int i = 0; i < n; ++i)
{
printf("%d\n", array[i]);
}
/*我通过在for初始值设定项中声明变量来使用C99构造*/
对于(int i=0;i
另外,如果不保留数组
指针的副本,请不要操作该指针只能对malloc
返回的指针执行free
使用索引与操作指针是一样的,否则你的教授就太可笑了。当你分配内存时,你无法在内存中确定它的结束位置(除非你决定一个约定并在某个地方设置一个值,但无论如何你都会使用n)。
在您的情况下,您必须使用n来限制阵列覆盖范围(否则它只受您的计算机容量限制,直到它到达无法访问的区域:程序崩溃)。例如(注意不要覆盖n!)
当您分配内存时,您无法在内存中确定它的结束位置(除非您决定一个约定并在某个地方设置一个值,但无论如何您都会使用n)。
在您的情况下,您必须使用n来限制阵列覆盖范围(否则它只受您的计算机容量限制,直到它到达无法访问的区域:程序崩溃)。例如(注意不要覆盖n!)
(;*array;array++)的代码>您应该删除代码>在末尾
此循环的迭代次数未定义,您将丢失一个指针
你应该这样做:
int *cur;
for(cur = array; cur < array+n; ++cur)
{
*cur = ...;
}
int*cur;
for(cur=数组;cur
(;*array;array++)的代码>您应该删除代码>在末尾
此循环的迭代次数未定义,您将丢失一个指针
你应该这样做:
int *cur;
for(cur = array; cur < array+n; ++cur)
{
*cur = ...;
}
int*cur;
for(cur=数组;cur
我不确定我是否理解“没有int索引”?你究竟为什么会受到这种限制?您是否“允许”使用指针算术?(即,*(数组+1);?)指针算法将是一种可行的方法。但这与索引完全相同(*(arr+2)
与arr[2]
)这是家庭作业问题的一部分,而不是整个家庭作业,限制只是因为教授希望我们尽可能优化(是的,我知道这有点过头了)。除非你使用老师编写的编译器,使用索引或指针将产生完全相同的代码。另外,需要考虑的是:如果您知道n,您从一开始就知道,最后一个有效指针值应该是什么。。。现在做你的家庭作业…我不确定我是否理解“没有int索引”?你究竟为什么会受到这种限制?您是否“允许”使用指针算术?(即,*(数组+1);?)指针算法将是一种可行的方法。但这完全是错误的