【发布时间】:2019-12-09 20:30:32
【问题描述】:
给定
unsigned long long int strtoull (const char* str, char** endptr, int base);
这有效吗?
unsigned char *s = "123";
unsigned char *t;
unsigned long long n = strtoull(s, &t, 0);
通常不能将指针指向一种类型并强制转换并将其用作指向另一种类型的指针,严格来说char 和unsigned char 是不同的类型,所以虽然上面的代码有某种意义显然是合理的,我想确保它不是严格标准的未定义行为。
【问题讨论】:
-
为什么一开始就使用
unsigned char *作为字符串呢?这是来自使用它的遗留代码吗? -
@Someprogrammerdude 除此之外,至少某些版本的
ctype.hisxxxxx 对于负数是未定义的,因此如果输入字节有很多使用ctype.h和普通char*的程序是未定义的高位设置。 -
我通常只在实际需要时才进行这种转换(即当调用
isalnum等时)。作为奖励,您可以避免这个问题。 -
我不确定“标准的严格字母”,但就像你说的,它通常会起作用。尝试使用 -pedantic -Wall 进行编译,看看你的编译器是怎么想的。如果您仍然担心,我会将内容转换为 void* 以通过它,然后根据需要在 strtoull() 中重新转换。
-
@SanderDeDycker “仅在实际需要时(即调用 isalnum 等时)进行转换。”这里的应用不清楚。这篇文章是关于 pointer 转换的。
is...(int ch)都是关于int。
标签: c pointers casting language-lawyer undefined-behavior