在 C 中创建和初始化用户定义类型的数组

标签 c arrays pointers malloc command-line-arguments

我最近开始学习 C,如果我的问题非常基础或不清楚,我深表歉意。

我正在向我的程序传递 3 个命令行值。 (类型、长度、值)。我想使用这些值在类型为 TYPE、长度为 LENGTH 的堆上创建一个数组,并将所有元素初始化为 VAL。例如

float 8 4 :将创建一个包含 8 个元素的 float 组,每个元素的值为 4。

char 4 65 :将创建一个包含 4 个元素的 char 数组,每个元素的值为“A”。

确定长度很简单。但我正在努力确定如何初始化指向数组和 VAL 的指针。

以下是我迄今为止尝试过的(未成功)。我正在初始化一个 char 指针,但是我知道这是不正确的,因为我可能需要一个 float 或 int 指针。我还使用了基于 TYPE 的第一个字符的 switch 语句,对我来说这似乎很老套。

int main (int argc, char *argv[]){

        int LENGTH;
        char *ptr;

        LENGTH = atoi ( argv[2] );


        switch( *argv[1] ){
                case 'f':
                        printf("Type is float\n");
                        ptr = (float *)malloc(LENGTH * sizeof(float));
                        break;
                case 'c':
                        printf("Type is char\n");
                        ptr = (char *)malloc(LENGTH * sizeof(char));
                        break;
                case 'i':
                        printf("Type is int\n");
                        ptr = (int *)malloc(LENGTH * sizeof(int));
                        break;
                default:
                        printf("Unrecognized type");
                        break;
        }

        while( i < arrayLength ){
                *ptr[i] = *argv[3];
                i++;
        }

        free ( ptr );

        return 0;
}

我还可以看到问题的初始化元素的问题。初始值取决于需要转换的TYPE。

我想知道的是,在事先不知道 TYPE 的情况下,如何创建指针或初始化值?我可能完全从错误的方向看待这个问题,所以任何建议将不胜感激。

谢谢

最佳答案

这里是修改后的代码来完成你所要求的(见下面的注释):

#include <stdio.h>
#include <stdlib.h>
#include <string.h> // for memset()

int main (int argc, char *argv[]){

        int LENGTH;
        int i;

        void *ptr = NULL;

        if(argc < 4)
        {
            fprintf(stderr, "Usage: %s type len data\n", argv[0]);
            return 1;
        }

        LENGTH = atoi ( argv[2] );


        switch( *argv[1] ){
                case 'f':
                        printf("Type is float\n");
                        ptr = (float *)malloc(LENGTH * sizeof(float));
                        for(i = 0; i < LENGTH; i++)   // Cannot use memset in that case: memset(3) only works with integers.
                            ((float *)ptr)[i] = (float)atof(argv[3]);
                        for(i = 0; i < LENGTH; i++)
                            printf("[%d]: %lf\n", i, ((float *)ptr)[i]);
                        break;
                case 'c':
                        printf("Type is char\n");
                        ptr = (char *)malloc(LENGTH * sizeof(char));
                        memset(ptr, (char)atoi(argv[3]), LENGTH);
                        for(i = 0; i < LENGTH; i++)
                            printf("[%d]: %c\n", i, ((char *)ptr)[i]);
                        break;
                case 'i':
                        printf("Type is int\n");
                        ptr = (int *)malloc(LENGTH * sizeof(int));
                        memset(ptr, (int)atoi(argv[3]), LENGTH);
                        for(i = 0; i < LENGTH; i++)
                            printf("[%d]: %d\n", i, ((int *)ptr)[i]);
                        break;
                default:
                        printf("Unrecognized type\n");
                        break;
        }

        if(ptr == NULL)
            return 1;

        free ( ptr );

        return 0;
}

不过,正如其他人指出的那样,这样做毫无意义。之所以使用类型是为了知道两件事:

  1. 数据的大小
  2. 如何解读

你在这里试图实现的是一种笨拙的尝试来完成操作系统的工作。

明确一点:内存是一个连续的存储空间,操作系统将其标记为“已分配”(通过 malloc(3) 等函数)。当它这样做时,程序必须知道数据的类型才能知道要读取什么(指针只是一个地址),以及如何解释它(int 的存储方式不同float 是)。

如果您真的有兴趣学习这些东西(数据如何存储,计算机如何更普遍地工作,并且比 C# 更底层),我建议您阅读:

  1. MIPS assembly tutorial (来自谷歌的第一个相关答案,任何 MIPS asm 类(class)都可以)

  2. x86 Assembly, 6th ed.如果你有钱买它。

此外,如果您想测试 MIPS 汇编,mars是一个可以正常工作(并且免费)的 MIPS 汇编模拟器。

我很高兴看到人们仍在努力学习 C。

关于在 C 中创建和初始化用户定义类型的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13829819/

相关文章:

c++ - 关于c++中的指针

c - execv() 执行进程时,如何在 C 中杀死进程及其所有子进程?

c# - struct c#中的安全固定大小数组

C11 - 将指向结构的指针转换为结构的匿名第一个成员

c - "char s[static 10]"等函数的数组参数中 static 关键字的用途是什么?

python - Numpy:沿指定轴 reshape 数组

c# - 从 C# 调用 C++ 时如何最好地处理未使用的指针?

c - 如何用 C 创建我自己的延迟函数

c - c-如果将hdc传递给方法,则不会绘制win32 api矩形

c - 用结构体成员减去结构体成员?