小编Tom*_*Tom的帖子

struct中的可变长度数组

我正在用C语言编写应用程序(作为初学者),我正在努力在包含可变长度数组的结构中获取损坏的数据.我发现cprogramming.com上的论坛帖子以及cert.og/secure-coding中描述的类似问题.我以为我找到了正确的解决方案,但似乎没有.

结构看起来像这样;

typedef struct {
    int a;
    int b;
} pair;

typedef struct {
    CommandType name;
    pair class;
    pair instr;
    pair p1;
    pair p2;
    pair p3;
    CommandType expected_next;
    char* desc;
    int size;
    pair sw1;
    pair sw2;
    pair* data;
} command;
Run Code Online (Sandbox Code Playgroud)

有问题的是"命令".对于"命令"的任何给定实例(或任何正确的短语),将设置不同的字段,但在大多数情况下,尽管在不同的实例中设置相同的字段.

我遇到的问题是在尝试设置expected_next,name,sw1,sw2,size和data字段时.这是数据领域正在变得腐败.我正在为这样的结构分配内存;

void *command_malloc(int desc_size,int data_size)
{
    return malloc(sizeof(command) +
                  desc_size*sizeof(char) +
                  data_size*sizeof(pair));
}

command *cmd;
cmd = command_malloc(0, file_size);
Run Code Online (Sandbox Code Playgroud)

但是当我(漂亮地)打印生成的cmd时,数据字段的中间似乎是随机垃圾.我已经介绍了gdb,可以看到正确的数据被加载到该字段中.它似乎只有当命令传递给另一个函数时它才会被破坏.这个代码在一个函数内部调用;

command* parse(char *line, command *context)
Run Code Online (Sandbox Code Playgroud)

漂亮的印刷品发生在另一个功能上;

void pretty_print(char* line, command* cmd)
Run Code Online (Sandbox Code Playgroud)

我以为我做的事情是正确的,但显然不是.据我所知,我构造了结构的其他实例好(并且我为这一个重复了这些方法)但是它们中不包含任何可变长度数组并且它们的漂亮打印看起来很好 - 这让我担心,因为它们可能也会被打破,但破损不太明显.

我正在编写的实际上是一个解析器,所以命令被传递到parse函数(它描述当前状态,给解析器提示接下来会发生什么),下一个命令(从输入"line"派生)是回."context"在解析函数结束时是free-d,新命令返回 - 然后将返回到"解析"并输入下一个"行".

任何人都可以建议为什么会发生这种情况?

非常感谢.

c arrays malloc struct

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

使用SQL Server Management Studio中的setvar转义空格字符

首先,我不是DBA,我没有任何(管理员)SQL Server经验,所以请在回答时使用几个音节很少的单词...

我正在运行SQL Server 2008 R2并尝试编写一个概念验证脚本,该脚本设置非分区,双向,事务复制.我已经设法从MS站点调整脚本工作,现在我正在尝试根据我们的需求进行自定义.这涉及将一堆值拉出到变量中.

我已经将SSMS设置为"SQLCMD模式",并且我的所有变量都可以解析,除了一个.

:setvar ReplicationDirectory 'C:\Program Files\Microsoft SQL Server\MSSQL10_50.SQL2\MSSQL\repldata';
Run Code Online (Sandbox Code Playgroud)

这给了我错误:

发生了致命的脚本错误.解析时遇到错误的语法:setvar

我已将问题缩小到变量值中存在空格.根据我一直在阅读的内容,这应该没有问题.我试过用双打替换单引号(正常种类和角度类型)但都给了我同样的错误.

我在网上找不到任何告诉我如何逃避空间角色的东西.我见过的所有文章都说如果字符串在引号中,SSMS只会将它们之间的任何内容解释为单个字符串 - 无论空格如何.

有没有人有任何想法?

我想我可以将变量的值更改为:

:setvar ReplicationDirectory 'C:\Progra~1\Micros~1\MSSQL10_50.SQL2\MSSQL\repldata';
Run Code Online (Sandbox Code Playgroud)

但我宁愿解决"为什么我不能使用空格?" 而不是问题.

非常感谢.

汤姆

sqlcmd sql-server-2008

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

Docker run 似乎忽略了 name 参数

我已经基于我编写的一些 Dockerfile 构建了一个 docker 镜像。

docker build -t someuser/somerepo:sometag .

但是当我使用 name 属性运行此图像时,它显然被忽略了。

docker run -t someuser/somerepo:sometag -d --name="somename"

Docker ps 然后给出;

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a0225d20fddf someuser/somerepo:sometag "/bin/sh -c '/usr/lo 26 seconds ago Up 26 seconds 8600/tcp, 8600/udp tender_curie

分配的名称遵循 dockers 随机名称生成器。

图像本身按预期工作,似乎正在做它的事情。我知道,这看似微不足道,但我无法让正在运行的容器接受名称。我已经尝试了尽可能多的“--”变体,包括/排除等号、不同的引号字符等。

所以问题是;我做错了什么?

谢谢。

docker

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

标签 统计

arrays ×1

c ×1

docker ×1

malloc ×1

sql-server-2008 ×1

sqlcmd ×1

struct ×1