我有一个与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以适当的长度指向那里,让它成为正确的东西.谢谢您的帮助.这个地方很棒!
当您尝试将某个内容转换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) 当我们处理前一个或下一个为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)
为什么会出现分段错误?
我正在尝试写一个简单的列表.我有下一个代码:
#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 ++的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,并且在演员表面遇到麻烦.以下是我认为相关的代码行:
#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)
但那也不起作用.
有人可以帮我理解如何做到这一点吗?谢谢!
关于处理无效*的帖子很多.我已按照他们的指示行事.但是,当尝试将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)
任何有关这方面的帮助将不胜感激.
考虑以下计划:
#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*)的函数?
如果我遗漏了某些东西或者对错误的理解,请纠正我.
我读了以下程序代码:
#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++应用程序中实现通用消息传递系统.
该程序被分为不同的系统,处理渲染,图像加载等不同的事情.我希望它们能够将消息推送到消息堆栈中,并使用某种类型的数据进行传输.
为了实现这一点,我制作了一个允许这样的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 *真的是一种不安全的方法来实现这样的功能吗?有没有更好的方法来实现这种松散的类型检查?
void-pointers ×10
c ×5
c++ ×3
pointers ×3
casting ×2
nsstring ×2
objective-c ×2
c99 ×1
g++ ×1
ios7 ×1
keychain ×1
list ×1
messaging ×1
polymorphism ×1
printf ×1