在c中数组中出现的随机元素

ep6jt1vc  于 2023-10-16  发布在  其他
关注(0)|答案(4)|浏览(82)

所以就像在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
p8h8hvxi

p8h8hvxi1#

C不会自动以零终止数组(字符串文字除外)。如果你想用一个零来标记数组的结束,你必须把它放在那里。
C不会自动增长数组。push例程不会在数组中为新元素腾出空间。它会破坏你的程序。
要修补将数字推到这样的列表中,您可以声明myNumbers具有大量空间,就像int myNumbers[100] = {25, 50, 75, 100, 0};为100个元素保留空间并用零标记前几个元素的结尾一样。随着你对C的了解越来越多,你将了解到其他管理内存的方法。

6yt4nkrj

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值输出为十进制数。

cnjp1d6j

cnjp1d6j3#

代码中的问题与数组边界和内存访问有关。当你在C中像这样声明一个数组时:int [] = {25,50,75,100};,它具有4个元素的固定大小。您无法直接向其添加超出其初始大小的元素,而不会导致未定义的行为,这就是为什么您会获得意外的随机值。
要解决此问题,您需要处理动态内存分配,以便在想要添加更多元素时增加数组的大小。下面是使用动态内存分配实现此目的的代码的修改版本:
//文件名:list.c

#include <stdio.h>
#include <stdlib.h>
#include "l.h"

int main() 
{
    int* myNumbers = (int*)malloc(4 * sizeof(int)); // Allocate memory for 4 elements
    int length = 4;
    myNumbers[0] = 25;
    myNumbers[1] = 50;
    myNumbers[2] = 75;
    myNumbers[3] = 100;
    
    push(myNumbers, 125, &length);
    push(myNumbers, 200, &length);
    
    for (int i = 0; i < length; i++) {
        printf("array[%d] = %d\n", i, myNumbers[i]);
    }
    
    free(myNumbers); // Free the dynamically allocated memory
    
    return 0;
}

//文件名:l.c

#include "l.h"
#include <stdio.h>
#include <stdlib.h>

void push(int* list, int value, int* length)
{
    list[*length] = value;
    (*length)++;
}

//文件名:l.h

#ifndef L_H
#define L_H

void push(int* list, int value, int* length);

#endif

在这个版本中,myNumbers数组是使用malloc动态分配的,其大小最初设置为4。length变量跟踪数组中的元素数量。调用push函数时,它会将新元素添加到数组的末尾,并递增长度变量。这样,您可以添加超出初始大小的元素,而不会出现任何问题。
记住,当您完成数组时,使用free(myNumbers)释放动态分配的内存,以避免内存泄漏。

ruarlubt

ruarlubt4#

你可以用更多的空格声明int myNumbers[],比如-

int myNumbers[100] = {25, 50, 75, 100, 125};

相关问题