我最近开始学习 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;
}
不过,正如其他人指出的那样,这样做毫无意义。之所以使用类型是为了知道两件事:
- 数据的大小
- 如何解读
你在这里试图实现的是一种笨拙的尝试来完成操作系统的工作。
明确一点:内存是一个连续的存储空间,操作系统将其标记为“已分配”(通过 malloc(3)
等函数)。当它这样做时,程序必须知道数据的类型才能知道要读取什么(指针只是一个地址),以及如何解释它(int
的存储方式不同float
是)。
如果您真的有兴趣学习这些东西(数据如何存储,计算机如何更普遍地工作,并且比 C# 更底层),我建议您阅读:
MIPS assembly tutorial (来自谷歌的第一个相关答案,任何 MIPS asm 类(class)都可以)
x86 Assembly, 6th ed.如果你有钱买它。
此外,如果您想测试 MIPS 汇编,mars是一个可以正常工作(并且免费)的 MIPS 汇编模拟器。
我很高兴看到人们仍在努力学习 C。
关于在 C 中创建和初始化用户定义类型的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13829819/