小编Des*_*tor的帖子

为什么这个简单的C程序在运行时崩溃?

我尝试了以下简单的C程序,但它在运行时崩溃而没有提供任何输出.这有什么不对?我怎么解决这个问题?

#include <stdio.h>
#include <string.h>
int main(void)
{
    char *s1="segmentation";
    char *s2="fault";
    char *s3=strcat(s1,s2);
    printf("concatanated string is %s",s3);
}
Run Code Online (Sandbox Code Playgroud)

c string pointers runtime-error strcat

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

这是C++中的聚合初始化还是默认初始化?

考虑以下程序.

#include <iostream>
int main()
{
    int a=int{};
    std::cout<<a;
}
Run Code Online (Sandbox Code Playgroud)

它是使用聚合初始化还是默认初始化?我很迷惑.

c++ initialization aggregate-initialization

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

在函数参数中使用auto关键字是否可以?

我知道auto关键字的含义已完全从C++ 11中改变.但是最近我编写了一个简单的程序,在编译=std=c++98选项时可以编译和运行.

#include <iostream>
void fun(auto int a)
{   
    a=3;
    std::cout<<a<<'\n';
}
int main()
{
    fun(3);
}
Run Code Online (Sandbox Code Playgroud)

Orwell Dev C++ IDE给出了如下警告:

[Warning] 'auto' changes meaning in C++11; please remove it [-Wc++0x-compat]
Run Code Online (Sandbox Code Playgroud)

那么,auto用于函数参数是否可以,或者我是否应该auto像上面的程序一样使用它来保持与C++ 11的兼容性?

c++ auto c++11

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

函数参数中的void指针

考虑以下计划:

#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*)的函数?

如果我遗漏了某些东西或者对错误的理解,请纠正我.

c++ pointers parameter-passing void-pointers

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

我用于C++程序的文件扩展名是否重要?

我正在使用Orwell Dev C++ 5.8.3 IDE.它使用g ++ 4.8.1编译器.当我保存我的C++程序文件时,它会显示几个文件扩展名,用于保存我的C++程序文件.cpp, .cc, .cxx, .c++, .cp.

我选择哪个扩展名是否重要?

这些扩展是编译器/ IDE特定的还是特定于平台的?

我使用的是Windows 7操作系统.

这些扩展是否也可以在Unix或Linux等其他操作系统上使用和/或有效?

为什么提供这么多扩展?

是什么原因?

c++ file-extension g++

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

在C++中交换class&struct关键字

我读的怪C++的功能,称为大约一个注入的类名 在这里.

我试过按照简单的程序

#include <iostream>
class test
{
    int s{3};
    public:
    int get_s()
    { return s; }
};
int main() {
    class test::test s;  // struct test::test s; also allowed. Why???
    std::cout<<s.get_s();
}
Run Code Online (Sandbox Code Playgroud)

如果我在main()程序的第一行用struct替换class关键字仍然编译并运行正常.在这里查看现场演示.为什么?我不应该得到编译错误吗?为什么编译好?

c++ injected-class-name

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

关于C++中删除运算符的困惑

这看起来很简单,但我的朋友和我一起辩论,下面的程序会调用UB.但我认为他是不正确的.考虑以下计划:

#include <iostream>
int main()
{
    int* p=new int[3]();
    int* q=p;
    for(int i=0;i<3;i++)
        std::cout<<q[i]<<' ';
    delete[] q;
    std::cout<<'\n';
}
Run Code Online (Sandbox Code Playgroud)

这个程序的行为是否定义得很好?如果我写delete [] p会发生什么?而不是删除[] q; ?有效吗?

c++ arrays variable-assignment delete-operator

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

如何创建我的抽象类的无名派生类的对象?

考虑遵循Java程序:

abstract class Surprising
{       
    void fun()
    {
        System.out.println("fun() is invoked");
    }
}
class myclass
{
    public static void main(String args[])      
    {
        Surprising s=new Surprising() { };
        s.fun();
    }
}
Run Code Online (Sandbox Code Playgroud)

这里我创建了我的抽象类令人惊讶的无名子类的对象,而不是抽象类的对象,因为它不允许在Java中创建抽象类的对象.

什么是等效的C++程序?是否可以在C++中执行此操作?如果是,怎么回事,为什么不允许?

c++ java inheritance abstract-class pure-virtual

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

basic_string类是否真的具有需要多个参数的复制构造函数,还是只是构造函数?

我正在阅读为什么复制构造函数有多个参数?.

接受的答案说:

std::basic_string的确有一个:

basic_string(const basic_string& s, 
         size_type pos = 0, size_type n = npos)
Run Code Online (Sandbox Code Playgroud)

但是http://www.cplusplus.com/reference/string/basic_string/basic_string/说:

basic_string (const basic_string& str, size_type pos, size_type len = npos,
              const allocator_type& alloc = allocator_type());
Run Code Online (Sandbox Code Playgroud)

上面不是复制构造函数,而是子串构造函数,它复制str从字符位置开始pos并跨越len字符的部分.

C++标准部分说:

如果X类的第一个参数是X&,const X&,volatile X&或const volatile X&,并且没有其他参数或者所有其他参数都有默认参数,则X类的非模板构造函数是一个复制构造函数

那么,该链接的接受答案是否不正确?这是子串的真正basic_string类构造函数吗?我已经在链接上检查了C++ 98,C++ 11和C++ 14规范中的原型并显示了相同的内容.

c++ string parameters stdstring copy-constructor

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

为什么这个赋值操作导致函数调用不明确?

考虑以下程序编译并运行正常:

#include <iostream>
#include <string>
using std::string;
struct BB
{
 // generic cast
 template<typename T>
 operator T() const
 {   
   std::cout<<"Generic cast\n";
   return 0;
 }
 // string cast
 operator string() const
 { 
   std::cout<<"string cast\n";
   return string("hello");
 }
};
int main()
{
  BB b;
  string s = b; // copy constructor
}
Run Code Online (Sandbox Code Playgroud)

但如果我稍微更改main()函数的代码如下:

int main()
{
  BB b;
  string s;
  s = b;
} 
Run Code Online (Sandbox Code Playgroud)

编译器给出以下错误消息(请参阅此处的实时演示)

[Error] ambiguous overload for 'operator=' (operand types are 'std::string {aka std::basic_string<char>}' and 'BB') …
Run Code Online (Sandbox Code Playgroud)

c++ function-call ambiguous-call assignment-operator

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