我在第5行的错误中遇到了以下代码的问题:
错误:无效转换
void*为char*
我正在使用g ++和codeblocks,我试图将此文件编译为cpp文件.有关系吗?
#include <openssl/crypto.h>
int main()
{
char *foo = malloc(1);
if (!foo) {
printf("malloc()");
exit(1);
}
OPENSSL_cleanse(foo, 1);
printf("cleaned one byte\n");
OPENSSL_cleanse(foo, 0);
printf("cleaned zero bytes\n");
}
Run Code Online (Sandbox Code Playgroud) 像这样转换int时:
char a[256];
sprintf(a, "%d", 132);
Run Code Online (Sandbox Code Playgroud)
什么是确定如何大的最好方式一个应该是什么?我假设手动设置它很好(因为我看到它在任何地方使用),但它应该有多大?在32位系统上可能的最大int值是多少,是否有一些棘手的方法来确定它?
我有这个程序打印2个不同实例之间的时差,但它打印精度为秒.我希望以毫秒为单位打印它,另一个以纳秒为单位进行打印.
//Prints in accuracy of seconds
#include <stdio.h>
#include <time.h>
int main(void)
{
time_t now, later;
double seconds;
time(&now);
sleep(2);
time(&later);
seconds = difftime(later, now);
printf("%.f seconds difference", seconds);
}
Run Code Online (Sandbox Code Playgroud)
我怎么能做到这一点?
我这样使用snprintf以避免缓冲区溢出:
char err_msg[32] = {0};
snprintf(err_msg, sizeof(err_msg) - 1, "[ ST_ENGINE_FAILED ]");
Run Code Online (Sandbox Code Playgroud)
-1如果字符串长度超过32个字节,我为null终止符添加了保留空间.
我的想法是否正确?
平台:
我正在编写一个库,并希望使它绝对与资源无关,这也意味着库应该使用用户提供的内存分配功能.库允许用户也设置自己的错误处理函数,这些函数以错误消息作为参数调用,如下所示:
typedef void (*error_handler)(const char* msg);
Run Code Online (Sandbox Code Playgroud)
库代码自己准备错误消息,就像那样(消息格式化失败的情况):
char buf[BUF_SIZE];
snprintf(buf, BUF_SIZE, "Oops found at file '%s' line %d", __FILE__, __LINE__);
Run Code Online (Sandbox Code Playgroud)
但是我可以确定snprintf不会为malloc的内部使用分配更多内存,显然会绕过用户提供的分配例程吗?我的Linux系统中的手册页对此保持沉默.
在我的C++代码中经常使用以下类型的辅助函数:
static inline std::string stringf(const char *fmt, ...)
{
std::string ret;
// Deal with varargs
va_list args;
va_start(args, fmt);
// Resize our string based on the arguments
ret.resize(vsnprintf(0, 0, fmt, args));
// End the varargs and restart because vsnprintf mucked up our args
va_end(args);
va_start(args, fmt);
// Fill the string
if(!ret.empty())
{
vsnprintf(&ret.front(), ret.size() + 1, fmt, args);
}
// End of variadic section
va_end(args);
// Return the string
return ret;
}
Run Code Online (Sandbox Code Playgroud)
它有一些上升空间:
现在,我有一些问题:
此代码段的预期行为是什么?
char * aNullPointer = 0;
snprintf (res, 128, "Testing %s null pointer",aNullPointer);
Run Code Online (Sandbox Code Playgroud)
请注意,我故意试图让它取消引用我的空指针aNullPointer.
行为1)res指向字符串"Testing(null)null指针"
行为2)Seg Fault
根据我的平台,我似乎得到了不同的行为.某些snprintf实现执行完整性检查,而其他实现则不执行.
什么是最常见的行为?
我的应用程序中有以下功能:
void func(char *file, int line)
{
char stmt[150];
sprintf(stmt, "Failed in file %s, at line number %d", file, line);
}
Run Code Online (Sandbox Code Playgroud)
在这里,我采用 150 字节的字符数组(粗略猜测),而不是我需要找到我在 sprintf() 中给出的字符串的长度并采用该大小的数组。
请建议我是否在 C 中使用这种工具来查找格式化字符串的长度。谢谢 !
我听说有一个版本sprintf(),可能是一个GNU/gcc扩展,它可以分配自己的缓冲区,我必须free()或者可能使用堆栈就像alloca().
这两种方法都适合我.谁能告诉我我在想什么功能?