小编Rob*_*b L的帖子

这个C结构赋值语句是否合法?

这是一个代码示例,后跟我的问题:

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

struct st {

    char stringField[100];
    int intField;
};

typedef struct st st;

void test(st *parameterStruct)
{
    st localStruct;
    strcpy(localStruct.stringField, "HELLO");
    localStruct.intField = 5;

    *parameterStruct = localStruct;
}

int main()
{
    st myStruct;
    strcpy( myStruct.stringField, "XXX" );
    myStruct.intField = 9;

    printf("%s,%i\n", myStruct.stringField, myStruct.intField );

    test(&myStruct);

    printf("%s,%i\n", myStruct.stringField, myStruct.intField);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

OUTPUT:

XXX,9
HELLO,5
Run Code Online (Sandbox Code Playgroud)

我在想,因为结构'localStruct'是在一个函数内创建的(不使用malloc),它具有局部范围,因此一旦函数停​​止执行,它就可以自由地覆盖存储它的内存位置.但是,我尝试运行此示例程序并执行它没有任何问题.因为我将'myStruct'分配给局部变量'localStruct'(而不是动态分配的'localStruct'),所以我认为第二个打印语句会将乱码打印到屏幕上.我知道如果使用malloc创建了'localStruct',就不会出现这样的问题.

我的问题:是通过在函数测试中使用指针将结构变量'myStruct'(一个非动态局部变量)分配给y并且安全吗?我希望这个问题很清楚.

c

20
推荐指数
2
解决办法
637
查看次数

在 IdentityServer4 中,“idsrv”和“idsrv.session”cookie 之间有什么区别?

我了解idsrv.sessioncookie 用于检测用户的会话是否已更改。此 cookie 是IdentityServer 中提供的OIDC 会话管理实现的一部分。然后我不明白的是idsrvcookie 是做什么用的。有人可以解释一下吗?

identityserver4

11
推荐指数
2
解决办法
7327
查看次数

在 Serilog 中,如何在使用 {Properties} 格式说明符时从 JSON 格式的日志消息中删除空括号?

我有以下outputTemplate字符串:

var formatString = "{NewLine}[{Timestamp:dd-MMM-yyyy HH:mm:ss}] {Level} {SourceContext}{NewLine}{Properties:j}{NewLine}{Message:lj}{NewLine}{Exception}";
Run Code Online (Sandbox Code Playgroud)

我有几个丰富的配置来添加和删除属性。在没有要记录的属性的情况下,我一直在一行中获取空的 JSON 括号。例如,当有要记录的属性时,我会收到如下日志消息:

[05-Jul-2019 07:13:57] Information Microsoft.AspNetCore.Mvc
{ "UserName": "SomeUser" }
This is some log message with a property that was not removed by any of the enrichers.
Run Code Online (Sandbox Code Playgroud)

但是,在没有属性的情况下,我会得到这个

[05-Jul-2019 07:13:57] Information Microsoft.AspNetCore.Mvc
{}
This is some log message that contains no properties
Run Code Online (Sandbox Code Playgroud)

空的 JSON 括号{}散落在我的日志中,只是增加了噪音。如何扩展或覆盖 Serilog 以摆脱这些括号?

json serilog asp.net-core

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

算法设计手册中的乐透门票覆盖范围?

我正在阅读Steven S. Skiena的算法设计手册.我在第一章阅读有关彩票问题的内容.他声称他的第一个解决方案是保证获胜的最佳票数是不正确的.我不明白他的下一个和最后的解决方案是如何正确的?

图1.11中,他说:仅使用门票{1,2,3}和{1,4,5}来保证{1,2,3,4,5}中的获胜对,并且有一个图表.我很困惑为什么其他数字不在那里?例如,如果中奖号码是(3,4),(2,4),(2,5),(3,5)等,该怎么办?你显然无法将门票合并在一起,所以我们如何解释这个?有人可以解释一下吗?在彩票中,如果他们说中奖号码分别是3和5,那么你必须拥有一张票数为3和5的票.我对此感到失落.

algorithm

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

在IdentityServer中,客户端秘密和范围秘密之间有什么区别?

有人可以解释两者之间的区别吗?我了解客户秘密,但范围秘密仍然不明确......以及范围秘密甚至需要存在的原因?

虽然我发现文档在某些方面很有用,但我没有发现它有助于解释两者之间的区别.

identityserver3 identityserver4

8
推荐指数
2
解决办法
3310
查看次数

如何在C#中正确使用OpenID Connect jwks_uri元数据?

每个OpenID Connect提供程序都会发布包含jwks_uri属性的发现文档.从这里返回的数据jwks_uri似乎有两种不同的形式.一个表单包含名为x5c和的字段x5t.这样的一个例子如下:

{
    "keys": [
        {
            "kty": "RSA",
            "use": "sig",
            "kid": "C61F8F2524D080D0DB0A508747A94C2161DEDAC8",
            "x5t": "xh-PJSTQgNDbClCHR6lMIWHe2sg", <------ HERE
            "e": "AQAB",
            "n": "lueb...",
            "x5c": [
                "MIIC/..." <------ HERE
            ],
            "alg": "RS256"
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

我看到的另一个版本省略了x5c和x5t属性但包含en.一个例子是:

{
    "keys": [
        {
            "kty": "RSA",
            "alg": "RS256",
            "use": "sig",
            "kid": "cb11e2f233aee0329a5344570349cddb6b8ff252",
            "n": "sJ46h...", <------ HERE
            "e": "AQAB"      <------ HERE
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

我不太明白区别是什么,为什么有时会使用x5c/x5t组合,但有时候只是简单e/n.我正在使用C#Microsoft.IdentityModel.Tokens.TokenValidationParameters,我正在试图找出如何供应该物业IssuerSigningKey.此类的示例用法是

new TokenValidationParameters
{
    ValidateAudience …
Run Code Online (Sandbox Code Playgroud)

c# openid-connect jwk

8
推荐指数
3
解决办法
5006
查看次数

如何使用C中的scanf读取前导0作为一个int的数字?

我正在使用C来读取整数数据scanf("%i", &myInt).我知道对于这个特定的输入,数据总是三位数.但是,有时我需要读取前导0的数字,如001或078.当scanf()读取前导零的数字时,它不会拾取后续数字.例如,当我读078 scanf读7时,下一个scanf将读8.我想scanf读78.有人可以告诉我如何正确地做到这一点?这是一个代码示例:

int x;

while (scanf("%i", &x) != EOF) {

   //do operations on each of the digits

}
Run Code Online (Sandbox Code Playgroud)

c

6
推荐指数
2
解决办法
6129
查看次数

在Java中的双向链表上设置头部和尾部引用是否真的从内存中清除它?

有一天,我的数据结构课程教授(Java)说,"好吧,伙计们,我们怎样才能从内存中清除这个n元素双向链表?".我大声说出"将头部和尾部设置为空".他回答说"好的,但这真的从记忆中清除了吗?" 我说"是的,我是这么认为的".

无论如何,他接着说,由于列表中的节点之间有来回传递,所以它并没有真正从内存中清除它.我想我们正在看这样的事情:

        Head                                                                     Tail
null <-[null/data/node 2]-> <-[node1/data/node3]-> <-[node2/data/node4]-> <-[node3/data/null]->null
Run Code Online (Sandbox Code Playgroud)

让我们假设这是Java中典型的双向链表数据结构,其中Node是一个类(内部或单独的类),DoublyLinkedList类中唯一的实例变量是

 Node head;
Run Code Online (Sandbox Code Playgroud)

 Node tail;
Run Code Online (Sandbox Code Playgroud)

他说这是因为在列表的内部部分中,每个节点都有一个对下一个节点的引用,并且该节点具有对前一个节点的引用.他说在单链表中不会出现这种情况,因为引用只是"单行道",一旦你失去对第一个引用的引用,它们最终都会被垃圾收集.

当然,课堂上的每个人都分享了他们的观点,但课堂上没有人是我听过的任何人或从中获取编程建议,而且当我在Stack Overflow上提出一个问题与我的教授所说的问题时,我似乎得到了相互矛盾的信息.我.我会说实话,我没有足够的经验来讨论这个问题,但简单地说,我不知道我是否总是相信他所说的一切,因为他在我问过他的一两件事上是错的.

所以,确定

head = null;
Run Code Online (Sandbox Code Playgroud)

tail = null;
Run Code Online (Sandbox Code Playgroud)

从内存中清除整个列表?如果是这样,我该怎么验证呢?如果没有,那么摆脱清单的解决方案的一般想法是什么?逐节点删除?请留下您的想法和意见.

java doubly-linked-list

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

在Java中,为什么运行时没有泛型类型信息?

考虑这个例子来自一本书,有一个超类Gen和一个子类Gen2 ...

class Gen<T> { }

class Gen2<T> extends Gen<T> { }
Run Code Online (Sandbox Code Playgroud)

现在这本书的状态将不会编译(让我们假设它在一个主方法中)

Gen2<Integer> obj = new Gen2<Integer>();

if (obj instanceof Gen2<Integer>) {

    //do something
}
Run Code Online (Sandbox Code Playgroud)

无法编译,因为运行时不存在泛型类型信息.如果它在运行时不存在,它何时存在?我认为它在编译时不会存在,但会在运行时存在.当然,以下适用于带有通配符的运行时...

if (obj instanceof Gen<?>) {

    //do something else

}
Run Code Online (Sandbox Code Playgroud)

所以要澄清一下,我的问题是为什么通用类型信息在运行时不存在?我忽略了一个简单的概念吗?

java generics

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

对C字符串常量感到困惑

当我遇到这种C语言实现的Porters Stemming算法时,我发现了一个C-ism我很困惑.

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

void test( char *s )
{
    int len = s[0];

    printf("len= %i\n", len );

    printf("s[len] = %c\n", s[len] );
}

int main()
{
    test("\07" "abcdefg");

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

并输出:

len = 7
s[len] = g
Run Code Online (Sandbox Code Playgroud)

但是,当我输入

test("\08" "abcdefgh");
Run Code Online (Sandbox Code Playgroud)

或者任何长于7的字符串常量,第一对括号中的对应长度(即test("\09" "abcdefghi");输出为

len = 0
s[len] = 
Run Code Online (Sandbox Code Playgroud)

但任何输入都会test("\01" "abcdefgh");打印出该位置的字符(如果我们称第一个字符位置为1而不是0)

看起来如果test( char *s )读取第一对括号中的数字(它如何做到这一点我不确定,因为我认为s [0]只能读取一个字符,即'\')并打印最后一个字符第二对括号中的索引+ 1的字符串常量.

我的问题是:好像我们正在传递两个字符串常量test( char *s ).这里到底发生了什么,意思是,编译器如何在两对括号中"拆分"字符串?可能有的另一个问题是,是"blah" "abcdefg"一个连续的内存块形式的字符串?可能是我忽略了一些基本的东西,但即便如此我也想知道我忽略了什么.我知道这是一个基本概念,但我无法在网上找到一个明确的例子或情况来解释这一点,并且说实话,我不遵循输出.欢迎任何有用的评论.

c string

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