所以就像在python list中一样,我想尝试使用c实现(我是c编程新手)。这是我的代码
// File name:- list.c
#include <stdio.h>
#include <stdlib.h>
#include "l.h"
int main()
{
int myNumbers[] = {25, 50, 75, 100};
// int length = len(myNumbers);
push(myNumbers, 200, len(myNumbers));
for(int i = 0; myNumbers[i]; i++){
printf("array[%d] = %li\n", i, myNumbers[i]);
};
len(myNumbers);
return 0;
}
// File name:- l.c
#include "l.h"
#include <stdio.h>
int len(int arr[])
{
int i;
for(i = 0; arr[i]!='\0'; i++){
continue;
};
printf("Length is: %d\n", i);
return i;
}
void push(int list[], int value, int length)
{
// int length = len(list);
list[length] = value;
}
上面的代码给予了我想要的结果,即
Length is: 4
array[0] = 25
array[1] = 50
array[2] = 75
array[3] = 100
array[4] = 200
Length is: 5
而当int myNumbers[] = {25, 50, 75, 100, 125};
或数组中任何超过4个值时...
结果被赋予意外的随机值,例如:
Length is: 5
array[0] = 25
array[1] = 50
array[2] = 75
array[3] = 100
array[4] = 125
array[5] = 200
array[6] = 2782528512
array[7] = 1952226512
array[8] = 1
Length is: 9
如何解决这个问题?我甚至尝试过直接传递长度,甚至调用函数而不传递长度,但都不起作用...我检查了代码中的任何逻辑错误,我没能找到任何..
我希望这是我的结果…
Length is: 5
array[0] = 25
array[1] = 50
array[2] = 75
array[3] = 100
array[4] = 125
array[5] = 200
Length is: 6
4条答案
按热度按时间p8h8hvxi1#
C不会自动以零终止数组(字符串文字除外)。如果你想用一个零来标记数组的结束,你必须把它放在那里。
C不会自动增长数组。
push
例程不会在数组中为新元素腾出空间。它会破坏你的程序。要修补将数字推到这样的列表中,您可以声明
myNumbers
具有大量空间,就像int myNumbers[100] = {25, 50, 75, 100, 0};
为100个元素保留空间并用零标记前几个元素的结尾一样。随着你对C的了解越来越多,你将了解到其他管理内存的方法。6yt4nkrj2#
int myNumbers[] = { 25, 50, 75, 100 };
定义的数组正好有4个元素,并且没有空终止符。因此,调用len()
或尝试推送元素都有未定义的行为。您可以将
myNumbers
定义为int myNumbers[100] = { 25, 50, 75, 100 };
,并且您的代码将最多运行99个元素,因为剩余的元素将被初始化为0
。还要注意,
printf
说明符%li
需要一个long int
参数值,而myNumbers[i]
不是。您应该使用%i
或%d
将此int
值输出为十进制数。cnjp1d6j3#
代码中的问题与数组边界和内存访问有关。当你在C中像这样声明一个数组时:int [] = {25,50,75,100};,它具有4个元素的固定大小。您无法直接向其添加超出其初始大小的元素,而不会导致未定义的行为,这就是为什么您会获得意外的随机值。
要解决此问题,您需要处理动态内存分配,以便在想要添加更多元素时增加数组的大小。下面是使用动态内存分配实现此目的的代码的修改版本:
//文件名:list.c
//文件名:l.c
//文件名:l.h
在这个版本中,myNumbers数组是使用malloc动态分配的,其大小最初设置为4。length变量跟踪数组中的元素数量。调用push函数时,它会将新元素添加到数组的末尾,并递增长度变量。这样,您可以添加超出初始大小的元素,而不会出现任何问题。
记住,当您完成数组时,使用free(myNumbers)释放动态分配的内存,以避免内存泄漏。
ruarlubt4#
你可以用更多的空格声明int myNumbers[],比如-