【问题标题】:Create and print a dynamic float array in C在 C 中创建和打印动态浮点数组
【发布时间】:2017-02-07 18:40:12
【问题描述】:

我正在尝试创建一个动态浮点数组。用户应键入值,直到找到负值。然后在屏幕上显示数组。由于我不知道数组的大小,所以每次输入有效值时,我都会使用 realoc() 来增加数组的大小

我的代码为所有元素分配内存,但是当我打印数组时,出现分段错误。不知道是我赋值错误还是读取失败。

代码如下:

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

unsigned int createArray(float*);
void printArray(float *, unsigned int);

int main(){
    float *pArray = NULL;
    unsigned int arrayLength = 0;
    arrayLength = createArray(pArray);  
    printArray(pArray, arrayLength);
    return 0;
}

/**
 * Ask the user to fill an array untill he types a negative value
 * 
 * @param A pointer to the array we want to create
 * @return The final length of the array
 * 
*/
unsigned int createArray(float *pArray){
    float number = 1;
    int arrayLength = 0;

    while(number>0){
        printf("\nSetting number %d: ", arrayLength);
        scanf("%f", &number);
        arrayLength++;
        pArray=realloc(pArray, sizeof(float)*arrayLength);
        if(pArray==NULL){
            printf("\nERROR: Not enough memory");
            free(pArray);
            exit(0);
        }
        pArray[arrayLength-1] = number; 
    }


    return arrayLength;
}
/**
 * Prints an array given by the user 
 * 
 * @param Pointer to the array
 * @param Length of the array
 * 
*/
void printArray(float *pArray, unsigned int arrayLength){
    for(int i=0;i<arrayLength;i++){
        printf("\nItem[%d]: %.2f", i, *pArray+i);
    }
}

【问题讨论】:

  • 动态数组的处理方式与静态或自动数组的处理方式不同。
  • free(NULL) 有什么意义?
  • Touché,没有意识到这一点。
  • 行:while(number&gt;0) 不同意该问题也不同意用户提示。那是因为 0 不是负数,而是从有效输入值中排除,所以会导致循环退出。建议:while(number&gt;=0.0f)
  • 在编写float 文字时,数字必须包含小数点和尾随f。没有小数点,数字是整数,而不是浮点数。没有尾随的f,数字是double,而不是float

标签: c arrays dynamic


【解决方案1】:

您正在为createArray()中的一个局部变量保留空间,该变量的生命周期以函数结束,您需要传递pArray的地址:

arrayLength = createArray(&pArray);

然后将传递的指针解引用到函数中的指针:

unsigned int createArray(float **pArray)
{
    ...
    *pArray = realloc(*pArray, sizeof(float)*arrayLength);
     if (*pArray == NULL) {
    ...

【讨论】:

  • 所以在函数内部 pArray 将指向数组在内存中的方向, *pArray 指向我要存储数字的内存,而 **pArray 将指向单个元素?对不起,如果这是一个简单的问题,但我以前从未见过指针,因为我现在正在学习它们。
  • 是的,在您的问题中,您将pArray 的副本传递给函数,因此您正在为此(本地)变量保留空间,并且当您退出函数时,该变量不再存在,在 C 语言中,您使用运算符的地址“模拟”通过引用传递,如我的示例所示(请原谅我的英语不好)
  • 在 createArray() 中仍然出现分段错误。不知道发生了什么,第一次分配顺利,但现在它总是在第二次失败。也许是因为这个**(pArray+arrayLength-1) = number;
  • 试试*(*pArray+arrayLength-1) = number;(*pArray)[arrayLength-1] = number;
  • 非常感谢您对我的耐心:)。现在它起作用了,但也是最重要的,我明白为什么。我还必须在 printArray() 中更改它:printf("\nItem[%d]: %.2f", i, *(pArray+i));
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-11-11
  • 2013-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多