标签: void-pointers

在没有stringWithCString的情况下将void*转换为NSString*

我有一个与Keychain交互的程序.你在一个指针传递给一个空指针和钥匙扣引导它,我想,到了密码,也传递一个UInt32的指针,它会指向密码的长度.

然后我需要将它用作NSString,我试图直接将其转换为它,但它聚合了更多的位然后需要,这对密码不起作用.我试着用:

NSString* password=[NSString stringWithCharacters:passwordData length:passwordLength];
Run Code Online (Sandbox Code Playgroud)

这将密码更改为中文字符.不知道为什么.当我在调试模式下打印描述时,它给了我:

Printing description of password:
\u3039\u4839\u6d6f\u2165\u1566?
Run Code Online (Sandbox Code Playgroud)

我能够完美地使用它:

NSString* password=[NSString stringWithCString:passwordData length:passwordLength];
Run Code Online (Sandbox Code Playgroud)

但这是折旧的,我想避免使用它.我对C和Objective-C都很新,而且无效指针会引发我的循环.在调试模式下,我查看了指针指向的内存,它肯定在该内存位置.我尝试使用const char*,但它不喜欢说变量可能没有被初始化.

这是我用来获取钥匙串的方法

- (OSStatus) GetPasswordKeychain:(void*)passwordData length:(UInt32*)passwordLength label:(NSString*)serverName
{
 status=SecKeychainFindGenericPassword(NULL, (UInt32)[serverName length], [serverName UTF8String], usernameLength, username,passwordLength , passwordData, NULL);
return status;
}
Run Code Online (Sandbox Code Playgroud)

有没有办法让NSString以适当的长度指向那里,让它成为正确的东西.谢谢您的帮助.这个地方很棒!

objective-c keychain void-pointers nsstring

1
推荐指数
1
解决办法
2510
查看次数

C++ - 转换void指针

当您尝试将某个内容转换void*为某些内容时,C++是否会抛出运行时异常?

class Sheep
{
public:
    Sheep() { }

    ~Sheep() { }

    void Bah()
    {
        // Print Bah!
    }
};

class Unicorn
{
    Unicorn() { }

    ~Unicorn() { }

    void Stab(Sheep* s)
    {
        s->Bah();
    }
};


int main()
{
    Sheep sheep;

    void* ptr = (void*) &s;

    // I'm guessing this would be 'valid'
    Unicorn* unicorn = (Unicorn*) ptr;
    // This must go wrong..?
    unicorn->Stab(&sheep);

    return 0;
} 
Run Code Online (Sandbox Code Playgroud)

c++ polymorphism void-pointers

1
推荐指数
1
解决办法
2789
查看次数

void指针条件提升段错误

当我们处理前一个或下一个为null的指针时,我正在使用双链表并获得有关边缘情况的奇怪性能.GDB返回以下错误:

Program received signal SIGSEGV, Segmentation fault.
0x0804a9c1 in DLinkDelete (delete=0xd8c9d33c) at test.c:213
213             if (prevdl && prevdl->next) 
(gdb) p prevdl
$39 = (DoubleLink *) 0xdadadada
(gdb) p prevdl->next
$40 = (void *) 0x0
Run Code Online (Sandbox Code Playgroud)

DoubleLink是一个具有以下格式的结构:

typedef struct
{
    void *next;
    void *prev;
} DoubleLink;
Run Code Online (Sandbox Code Playgroud)

为什么会出现分段错误?

c c99 void-pointers

1
推荐指数
1
解决办法
294
查看次数

指针,列表和空白

我正在尝试写一个简单的列表.我有下一个代码:

#include "stdio.h"
#include "stdlib.h"

typedef struct _anObject {
  void* data;
  struct _anObject* previous;
  struct _anObject* next;
} object_t;


typedef struct _aHead {
  object_t* first;
  object_t* current;
  object_t* next;
  object_t* last;
  int index;
  int size;
} head_t;

head_t* new_list(void)
{
    head_t* list = malloc(sizeof(head_t));
    list->first = NULL;
    list->current = NULL;
    list->last = NULL;
    list->index = -1;
    list->size = 0;
    return list;
 }

void add_object_to_list(head_t* list, object_t* object)
{
    if (list->size == 0)
    {
    object->next = NULL;
    object->previous = NULL;
    list->first …
Run Code Online (Sandbox Code Playgroud)

c pointers list void-pointers

1
推荐指数
1
解决办法
161
查看次数

ISO C++禁止在转换为c ++的遗留代码中递增"void*"类型的指针

我知道它的旧问题,但是什么是保持现在转换为c ++的c app(遗留)的旧逻辑的简单解决方案?

在c工作:

void *p;
void *response = malloc(60 * 81);

p = response ;
p+=4;
Run Code Online (Sandbox Code Playgroud)

在g ++中给出:ISO C++禁止递增类型'void*'更新的指针:
如果我将其更改为char*即时获取此错误:

char *p;
char *response = malloc(60 * 81);

error: invalid conversion from ‘void*’ to ‘char*’
Run Code Online (Sandbox Code Playgroud)

char*还可以容纳其他类型(基本的),如short,int,bool?这就是为什么在这个遗留代码中使用它来保存diffident类型,

c g++ void-pointers

1
推荐指数
1
解决办法
1685
查看次数

转换无效*

我真的很喜欢C,并且在演员表面遇到麻烦.以下是我认为相关的代码行:

#define BUF 1025
char hostname[BUF];

hostname = *(char *) qpop(&queue);
Run Code Online (Sandbox Code Playgroud)

这是我从编译器得到的错误:

错误:从类型char分配类型'char [1025]'时出现不兼容的类型

请注意,函数qpop返回void*.我认为我的问题是如何从void*转换为char [1025].从错误消息中,我似乎要转换为char类型,但不是键入char [1025].我试过这个:

hostname = *(char[1025] *) qpop(&queue)
Run Code Online (Sandbox Code Playgroud)

但那也不起作用.

有人可以帮我理解如何做到这一点吗?谢谢!

c casting void-pointers

1
推荐指数
1
解决办法
220
查看次数

在Objective C中如何在不获取运行时错误的情况下将void*转换为NSString?

关于处理无效*的帖子很多.我已按照他们的指示行事.但是,当尝试将void*转换为NSString*时,我收到运行时错误.

我很确定我错过了一些简单的东西.:-)

请考虑以下代码:

NSString* testString = @"This is a test";
NSLog(@"voidTest = %@", [self voidTest:&testString]);
Run Code Online (Sandbox Code Playgroud)

并具有以下功能:

- (NSString*)voidTest:(void*)testString
{
    NSString* value = (__bridge NSString *)(testString);
    return value;
}
Run Code Online (Sandbox Code Playgroud)

运行此代码时,函数中的第一行会给出以下错误:

Thread 1: EXC_BAD_ACCESS(code=1, address=0x1200000070)
Run Code Online (Sandbox Code Playgroud)

任何有关这方面的帮助将不胜感激.

casting objective-c void-pointers nsstring ios7

1
推荐指数
1
解决办法
2007
查看次数

函数参数中的void指针

考虑以下计划:

#include <iostream>
void f(void* a)
{
    std::cout<<"(void*)fun is called\n";
    std::cout<<*(int*)a<<'\n';
}
int main()
{
    int a=9;
    void* b=(int*)&a;
    f(b);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

如果我像这样更改函数调用语句:

f(&b);

它仍然可以在运行时编译精细和崩溃.为什么?是什么原因?我不应该得到编译时错误吗?因为调用函数的正确方法是f(b).对?另外,为什么允许将NULL传递给参数类型为(void*)的函数?

如果我遗漏了某些东西或者对错误的理解,请纠正我.

c++ pointers parameter-passing void-pointers

1
推荐指数
1
解决办法
1万
查看次数

在整数指针前面写(void*)有什么意义?

我读了以下程序代码:

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


int main () {
    int *p;
    p= malloc(sizeof(int)); 
    *p=42; 

    printf("Pointer p has address %p and points to %p\n",
    (void*)&p, (void*)p);

   free(p);    

}
Run Code Online (Sandbox Code Playgroud)

我的问题涉及以下部分:

printf("Pointer p has address %p and points to %p\n", (void*)&p, (void*)p);
Run Code Online (Sandbox Code Playgroud)

我不明白(void*)它在做什么.这是演员吗?这样做有什么意义?

简单地写下面的内容有什么区别?

 printf("Pointer p has address %p and points to %p\n", &p, p);
Run Code Online (Sandbox Code Playgroud)

c printf pointers void-pointers format-specifiers

1
推荐指数
1
解决办法
390
查看次数

在C++中设计消息传递系统时使用void指针有多"安全"?

我正在尝试在我的C++应用程序中实现通用消息传递系统.

该程序被分为不同的系统,处理渲染,图像加载等不同的事情.我希望它们能够将消息推送到消息堆栈中,并使用某种类型的数据进行传输.

为了实现这一点,我制作了一个允许这样的API:

MessageStack.add(System * sender, 
                 System * receiver, 
                 MessageCodeEnum message_type, 
                 void * data);
Run Code Online (Sandbox Code Playgroud)

该变量message_type是一个枚举,它定义了所有消息命令,并且void * data应该是附加到消息的数据.这些消息以堆栈形式排列,并在每帧结束时进行评估.

假设要加载图像的renderer消息fileLoader.该renderer会添加一条消息,告诉fileLoader加载图像和消息将有一个void *在它里面,它实际上是一个const char *指向包含图像文件的路径为C字符串.

内部在处理该消息的功能的开关壳体块,我已经型铸这是一个消息数据void *到一个const char *使用普通的旧方式:

const char * temp = (const char *) data;
Run Code Online (Sandbox Code Playgroud)

现在这让我想到了这个问题.如果在任何消息事务中,程序知道正在传输什么类型的数据,这就是为什么我在输入类型时感到自信void *,那么使用void *真的是一种不安全的方法来实现这样的功能吗?有没有更好的方法来实现这种松散的类型检查?

c++ messaging void-pointers

1
推荐指数
1
解决办法
177
查看次数