比较相同的字符串文字是否总是正确的?

时间:2018-09-10 21:14:02

标签: c string

在C语言中,编译器/链接器是否必须将多次使用的相同字符串文字放入单个内存位置?

$compArray = (Get-ADComputer -Filter *).Name
$Proc = foreach ($strComputer in $compArray) {
    Get-WMIObject -Class Win32_Service -ComputerName $strComputer | 
    Where-Object {
        $_.Name -like 'SQL*' -or
        $_.Name -like 'MSSQL*' -or
        $_.Name -like 'OLAP*' -or
        $_.Name -like 'MSDTS*' -or
        $_.Name -like 'MSOLAP*' -or
        $_.Name -like 'ReportServer*'
    } | 
    Select-Object -Property  @{Name = 'Computer';Expression={$strComputer}}, Name, State | 
    Sort-Object -Property Name | 
    Format-Table -AutoSize
}
$Proc


# Results

Computer  Name            State  
--------  ----            -----  
LABSQL01 MSSQLFDLauncher Running
LABSQL01 MSSQLSERVER     Running
LABSQL01 SQLBrowser      Stopped
LABSQL01 SQLSERVERAGENT  Running
LABSQL01 SQLTELEMETRY    Running
LABSQL01 SQLWriter       Running



Computer  Name                 State  
--------  ----                 -----  
LABWSM01 MSSQL$MICROSOFT##WID Stopped

在这种情况下,上面的语句是否总是正确(在MSVC 2017中是),还是通常是未定义的行为

是否可能在const char* a = "abcdef"; const char* b = "abcdef"; //Compare pointers if (a == b) { printf("True\r\n"); } else { printf("False\r\n"); } 个不同的存储位置中有字符串文字abcdef?当然,我不计算像2这样的字符串,其中12abcdefgh是字符串的一部分,但是是独立的。

2 个答案:

答案 0 :(得分:2)

这里要比较的是字符串文字的 pointers 。字符串文字是静态分配在某些不应写入的内存中的。一个优化的编译器可能仅分配相同的字符串文字一次,因为它假定这些文字不会改变,并且没有多于一个副本的意义,这就是您在这里所观察到的。但这不能保证。

答案 1 :(得分:1)

这是未指定的行为,但是大多数编译器会对此进行优化以使其为真。如果要使用特定的编译器进行编码,则可能会找到一个开关或#pragma来控制折叠此类字符串,从而为您提供确定性。