当前位置: 首页 > 知识库问答 >
问题:

类型转换空指针int和字符串

司马念
2023-03-14

我要做的是将值存储在元素strucz数组中(该数组有一个成员void*data)

typedef struct {
void* data
} Element;

我已经把数组拼成了3个元素

Element* array = malloc(3 * sizeof(Element));

我知道如果数据是int,你可以这样做,但是如果数据是空的,你怎么做呢*

array[0].data = 65;

我试过打字

((*int)(array[0].data)) = 65;

但我得到消息预期表达式之前'in'

我的第二个问题是如何在元素结构中存储字符串(我不能使另一个成员成为字符串,它必须使用void指针)

我可以用strcopy或sscanf吗?

下面的主要样本,以防我做错了什么

#include "test.h"
int main (void)
{  
    Element* array = malloc(3 * sizeof(Element));
    ((*int)(array[0].data)) = 65;
    ((*int)(array[1].data)) = 64;
    ((*int)(array[2].data)) = 66;
}

编辑

抱歉,我应该添加数据将使用循环添加(迭代基于用户输入,因此arrayOfElements可能有5,8,20个ect元素),基于用户3386109答案

Element* arrayOfElements = malloc(3 * sizeof(Element));
arrayOfElements[0].data = malloc( sizeof(int) );
int *ptr = arrayOfElements[0].data;
*ptr = 65;

完美地工作,但如果我想做阵列的话[1]。数据=67

Element* arrayOfElements = malloc(3 * sizeof(Element));
 arrayOfElements[1].data = malloc( sizeof(int) );
 int *ptr = arrayOfElements[1].data;
 *ptr = 76;

我不能重用*ptr,即使我使用free(ptr),如果您不知道ArrayOfelments将有多少元素,是否仍有必要这样做?

共有2个答案

洪德寿
2023-03-14

你现在处境艰难。C标准(草案n1256)在6.3转换中规定:

2将操作数值转换为兼容类型不会更改值或表示形式

后来在6.3。2.3指针:

5整数可以转换为任何指针类型。除了前面指定的,结果是实现定义的,可能没有正确对齐,可能没有指向引用类型的实体,并且可能是陷阱表示。56)

6任何指针类型都可以转换为整数类型。除非前面指定,否则结果是实现定义的。如果结果不能用整数类型表示,则行为未定义。结果不必在任何整数类型的值范围内。

标准库甚至定义了一个特殊的整数类型intptr\u t,它可以接受而不丢失任何指针,但这只是一个信息部分。

无论如何,在所有常见的实现中,可以安全地将整数来回转换为指针,前提是:

  • 如果它最初是一个整数,您永远不要尝试引用它,而是在使用它之前将其转换回一个整数(与原始类型相同)。因为施法不应该改变表示,你得到的原始值
  • 如果它最初是一个指针,你不尝试使用它作为一个整数,除非你的实现确保没有陷阱表示-常见的实现允许它
  • 整数类型接受所有指针表示-如果不确定使用intptr_t

因此,您可以:

array[0].data = (void *) (intptr_t) 65;

后来

int i = (intptr_t) array[0].data;
纪佐
2023-03-14

您问题中的malloc创建了一个包含三个结构的数组。每个struct都有一个名为data的未初始化指针。在使用该指针之前,必须再次调用malloc对其进行初始化。

存储int

array[0].data = malloc( sizeof(int) );
int *ptr = array[0].data;
*ptr = 65;

要存储字符串:

array[0].data = malloc( strlen(str) + 1 );
strcpy( array[0].data, str );

下面是一个完整的示例,演示如何初始化数组,打印数组的元素,然后释放数组。请注意,ptr只是一个临时变量,用于避免与强制转换和取消引用void*相关的糟糕语法。(一个好的编译器将优化ptr变量。)

int main( void )
{
    int *ptr;
    char *str = "hello";

    Element *array = malloc(3 * sizeof(Element) );

    array[0].data = malloc( sizeof(int) );
    ptr = array[0].data;
    *ptr = 65;

    array[1].data = malloc( strlen(str) +  1 );
    strcpy( array[1].data, str );

    array[2].data = malloc( sizeof(int) );
    ptr = array[2].data;
    *ptr = 76;

    ptr = array[0].data;
    printf( "%d\n", *ptr );
    str = array[1].data;
    printf( "%s\n", str );
    ptr = array[2].data;
    printf( "%d\n", *ptr );

    for ( int i = 0; i < 3; i++ )
        free( array[i].data );
    free( array );
}

 类似资料:
  • 指针变量数据类型的强制转换 必须显式强制类型转换,不允许隐式类型转换 指向空间的强制类型转换,本质上就是普通变量的强制类型转换 int a = 10; float b = 3.14; int *pa = &a; float *pb = &b; *pa = (int)*pb; // 等价于 a = (int)b; 指针本身强制类型转换,改变的是对其指向空间的引用方式(空间大小和存储结构) int

  • 本文向大家介绍jquery把int类型转换成字符串类型的方法,包括了jquery把int类型转换成字符串类型的方法的使用技巧和注意事项,需要的朋友参考一下 jQuery中把获取的number类型数据转换成字符串类型 以上就是小编为大家带来的jquery把int类型转换成字符串类型的方法全部内容了,希望大家多多支持呐喊教程~

  • 我只是无法在c中转换不同的数据类型,我知道c是一种强类型语言,所以我在这里使用了,但我面临一个问题,错误消息是 从“std::string{aka std::basic_string}类型转换为“int”类型的static_

  • 在带有的行上。 怎么啦?

  • 指针变量也是变量,是变量就可以任意赋值,不要越界即可(32位编译器指针大小为4字节,64位编译器指针大小为8字节),但是,任意数值赋值给指针变量没有意义,因为这样的指针就成了野指针,此指针指向的区域是未知(操作系统不允许操作此指针指向的内存区域)。所以,野指针不会直接引发错误,操作野指针指向的内存区域才会出问题。 int a = 100; int *p; p = a; //把a的值赋值给指针变量p

  • 主要内容:到底使用字符数组还是字符串常量C语言中没有特定的字符串类型,我们通常是将字符串放在一个字符数组中,这在《 C语言字符数组和字符串》中已经进行了详细讲解,这里不妨再来演示一下: 运行结果: https://www.xnip.cn https://www.xnip.cn 字符数组归根结底还是一个数组,上节讲到的关于 指针和数组的规则同样也适用于字符数组。更改上面的代码,使用指针的方式来输出字符串: 运行结果: https://ww