以下是 C 标准库例程的原型strtol:
long int strtol(const char* str, char** endptr, int base);
Run Code Online (Sandbox Code Playgroud)
典型用法:
const char* str = "123a";
char* endptr;
long int value = strtol(str, &endptr, 10);
if (*endptr)
// Do something
else
// Do something else
Run Code Online (Sandbox Code Playgroud)
为什么要这样做呢?为什么不传递局部变量的地址?
例子:
long int strtol(const char* str, char* endptr, int base);
Run Code Online (Sandbox Code Playgroud)
用法:
const char* str = "123a";
char end;
long int value = strtol(str, &end, 10);
if (end)
// Do something
else
// Do something else
Run Code Online (Sandbox Code Playgroud)
我确信这个设计决定有一个合乎逻辑的原因,但我不太明白。
我试图在C中切换一个int数组的起始索引.准确地说,我有以下数组:
{ int array[4] = {1,2,3,4};}
Run Code Online (Sandbox Code Playgroud)
我希望将{array}更改为包含{2,3,4}的3个项目的数组.我想知道是否有一种简单的方法可以使用指针并且不移动数组中的所有元素.如果{array}仍然是4个项目的数组,只要前3个项目是{2,3,4},我也很高兴.我尝试了以下方法:
{array = &(array[1])}
Run Code Online (Sandbox Code Playgroud)
但是,这不起作用,我从类型'int*'}中分配类型'int [4]'时出现{不兼容类型'的错误.
我的印象是C数组是对数组第一个元素的引用.
谁能帮我这个?
我正在通过GDB对用C++编写的项目进行调试,并发现在GNU C++编译器中没有警告或错误地修改了const.
这不是我正在调试的程序,但这是我目睹的行为的一个例子:
#include <iostream>
int main(int argc, char *argv[]) {
const int x = 10;
int *px = (int *)&x;
++*px;
std::cout << "*px: " << *px << "\n";
std::cout << "x: " << x << "\n";
for (int i = 0; i < x; ++i)
std::cout << i+1 << "\n";
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我不能代表其他编译器,因为我只使用GNU C++编译器4.9.2版进行了测试.为什么允许这样的事情?这打破了const对象的整个点.
我用g ++ main.c -Wall -Werror编译了上面的代码
输出:
*px: 11
x: 10
1
2
3
4
5
6
7
8
9
10
Run Code Online (Sandbox Code Playgroud)