小编ffh*_*dad的帖子

为什么 strtol 需要一个指向指针的指针而不是单个指针?

以下是 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 strtol

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

你如何在C中移动数组的起始索引?

我试图在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数组是对数组第一个元素的引用.

谁能帮我这个?

c arrays pointers

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

为什么GNU 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)

c++ gcc

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

标签 统计

c ×2

arrays ×1

c++ ×1

gcc ×1

pointers ×1

strtol ×1