小编Fih*_*hop的帖子

使用strdup

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{    
    char *s;
    s = strdup("foo");
    printf("%s\n", s);
    getchar();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

看起来很无害,不是吗?但我的IDE,即Dev-C++,给出了以下警告:警告:赋值从整数中生成指针而不进行强制转换

如果您要更改此代码,警告将消失:

char *s;
s = (char*)strdup("foo");
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

任何人都可以帮我解释一下吗?

c

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

为什么先调用基类构造函数然后派生类构造函数

根据c ++规则,在定义派生类对象时,将调用基类构造函数来初始化基类成员,然后初始化派生类构造函数.对于析构函数,规则会恢复.

我想知道为什么要遵守这条规则.为什么第一个基础构造函数然后派生类构造函数?这样做有什么理由吗?或者只是因为它是c ++的定义.

谢谢,

c++ constructor destructor

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

从中序和层序遍历构造二叉树

首先,我想声明这不是家庭作业。我正在准备面试并遇到这个问题。我想我们可以通过中序级序遍历的定义。:-)。

例如:

      50
   /      \
 10        60
/  \       /  \
5   20    55    70
        /     /  \
      51     65    80
Run Code Online (Sandbox Code Playgroud)

上述树的中序和层序遍历为:

5、10、20、50、51、55、60、65、70、80

50, 10, 60, 5, 20, 55, 70, 51, 65, 80

我的点子:

(1) 遍历层序数组,找出出现在有序数组中的第一个元素。我们称这个元素为当前根。

(2) 在有序数组中找到当前根的索引。中序数组由索引分隔。中序数组的左边是当前根的左子树,中序数组的右边是当前根的右子树。

(3) 将有序数组更新为左边,然后转到步骤1。

(4) 将中序数组更新为其右侧,然后转到步骤2。

以上面的树为例。

(1) 5 is the first element appears in the in-order array. 

(2) [50 ...60] is the left sub-tree of 5 and [20 ... 80] is the right sub-tree of 5. 

(3) update the …
Run Code Online (Sandbox Code Playgroud)

binary-tree inorder data-structures

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

将bsxfun或arrayfun应用于矩阵的每一行

有两个矩阵,AB用尺寸m-by-4和n分别-by-4.我的问题是如何在fA和B的每一行上应用一个函数,它将两个1x4向量作为输入.结果将是一个大小为mx 的矩阵n.元素[I,J]中resultf(A(i, :), B(j, :)).

例如:

A = rand(3, 4);
B = rand(5, 4);
for i = 1 : 3
    for j = 1 : 5
        result(i, j) = rectint(A(i, :), B(j, :));
    end
end
Run Code Online (Sandbox Code Playgroud)

我可以使用bsxfunarrayfun做这项工作吗?

arrays matlab matrix bsxfun

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

生成边缘均匀分布的随机图

我正在尝试找到一种有效的算法来生成具有给定节点数的简单连通图。就像是:

Input:
    N - size of generated graph
Output:
    simple connected graph G(v,e) with N vertices and S edges, The number of edges should be uniform distribution.
Run Code Online (Sandbox Code Playgroud)

random algorithm graph

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

编译器的这个指针的详细信息,虚函数和多重继承

我正在阅读Bjarne的论文:C++的多重继承.

在第370页的第3节中,Bjarne说:"编译器将成员函数的调用转换为带有"额外"参数的"普通"函数调用;"额外"参数是指向成员函数的对象的指针叫做."

我对这个额外的论点感到困惑.请看以下两个例子:

示例1 :(第372页)

class A {
    int a;
    virtual void f(int);
    virtual void g(int);
    virtual void h(int);
};
class B : A {int b; void g(int); };
class C : B {int c; void h(int); };
Run Code Online (Sandbox Code Playgroud)

类c对象C看起来像:

C:

-----------                vtbl:
+0:  vptr -------------->  -----------
+4:  a                     +0: A::f
+8:  b                     +4: B::g
+12: c                     +8: C::h
-----------                -----------  
Run Code Online (Sandbox Code Playgroud)

对虚函数的调用由编译器转换为间接调用.例如,

C* pc;
pc->g(2)
Run Code Online (Sandbox Code Playgroud)

变成这样的东西:

(*(pc->vptr[1]))(pc, 2)
Run Code Online (Sandbox Code Playgroud)

Bjarne的论文告诉我上述结论.传球this点是C*.

在下面的例子中,Bjarne讲了另一个让我困惑的故事!


示例2 :(第373页)

鉴于两个班级

class A {...};
class …
Run Code Online (Sandbox Code Playgroud)

c++ pointers virtual-functions multiple-inheritance this-pointer

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

编写SQL查询以查找至少出现三次的所有数字

我正在练习SQL语言并得到一个类似的问题:

编写SQL查询以查找连续出现至少三次的所有数字.

+----+-----+
| Id | Num |
+----+-----+
| 1  |  1  |
| 2  |  1  |
| 3  |  1  |
| 4  |  2  |
| 5  |  1  |
| 6  |  2  |
| 7  |  2  |
+----+-----+
Run Code Online (Sandbox Code Playgroud)

例如,给定上面的Logs表,1是连续出现至少三次的唯一数字.

我在网上得到了一个解决方案并进行测试 但我真的不明白.解决方案的大局很清楚.sq表计算事件.但我不明白计算的部分sq.我对MYSQL做了很多研究.@counter := IF(@prev = Num, @counter + 1, 1)表示如果prev = Num,则使counter = counter + 1,否则counter = 1. (SELECT @counter:=1, @prev:=NULL) vars表示创建一个vars包含两列counter和的表pre …

mysql select

5
推荐指数
2
解决办法
1694
查看次数

通过使用更多空间来实现恒定的初始化时间-编程珍珠 - 第 1 栏

我正在阅读《Programming Pearls》,我对其中一个解决方案的解释感到非常困惑——第 1 列中的问题 9。

问题是:当使用位图数据表示一组整数时,第一阶段将该组初始化为空。但初始化空间本身可能会花费大量时间。展示如何通过设计一种在第一次访问向量时将向量条目初始化为零的技术来规避此问题。

答案是:初始化向量数据[0...n-1] 的效果可以通过包含在两个附加 n 元素向量fromto以及整数top 中的签名来实现。如果元素 data [i] 已初始化,则from [i] < topto [*from*[i]] = i。因此,from是一个简单的签名,totop一起确保from不会被内存的随机内容意外签名。

这个答案我已经读过好几遍了。我不明白。

有人可以解释一下吗?

谢谢,

initialization bitmap programming-pearls

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

为什么`memmove`使用`void*`作为参数而不是`char*`?

c库函数的定义memmove如下:

void* memmove(void *s1, const void *s2, size_t n)
{
    char *sc1;
    const char *sc2;

    sc1 = s1;
    sc2 = s2;
    ...
}
Run Code Online (Sandbox Code Playgroud)

我想知道为什么我们需要使用void*const void*作为参数的类型.为什么不直接char*const char*

更新

int test_case[] = {1, 2, 3, 4, 5, 6, 7, 8, 10};

memmove(test_case+4, test_case+2, sizeof(int)*4);
Run Code Online (Sandbox Code Playgroud)

输出:test_case = {1,2,3,4,3,4,5,6,10}

c memmove

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

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